Dart & Flutter

[Dart] 예외처리문 (try-catch, finally, on, throw, rethrow)

햇썽이 2024. 5. 2. 22:19

코드를 치다보면 Error를 발생할때가 많은데 그때마다 특정 코드를 실행하거나 print문을 작성하여 error형태를 잡는다.

1번 try-catch문을 가장 많이 쓰인다. (catch문에서 모든 error가 넘어가기때문에...)

1. try - catch 문 
2. finally 문
3. on 문
4. throw / rethrow 문

 

1~2. try-catch문 예시 ( + finally 문 )

void main() {
  int num1 = 5;
  try {
    /// 예외가 발생할 것으로 예상되는 코드를 넣는다.
    print( num1 / 0 );
  } catch(error, stack){
  	/// 에러가 발생했을떄 실행하고자 하는 코드를 넣는다. 
    print(error);
    print(stack);
  } finally {
    /// 예외가 발생했던, 하지 않았던 try & catch문 이후에 실행하고자 하는 코드를 넣는다.
    print('예외처리 문을 지나고나서 실행되는 코드입니다.');
  }
}

 

3~4. on, throw, rethrow문

On문 : 특정 Error에 대한 처리를 직접 처리하고싶을때 사용된다. 

throw문 : 해당 문에서 바로 원하는 형태의 Error를 던져주고 넘어간다.

rethrow : 이미 나왔던 Error의 형태문을 다시 던져주는 형태가 된다.

밑에 있는 코드는 throw문이 없는 예시 

void main() {

      try {
        /// 예외가 발생할 것으로 예상되는 코드를 삽입
        print( 100 / 0 );
      } on UnsupportedError catch(e, s){
        print('~/ 해당 연산자는 0으로 나눌 수 없습니다.');
      } on TypeError catch(e, s){
        print('Null 값이 참조 되었습니다.');
      } catch(e, s){
        print('모르는 에러가 발생했습니다.');
      }

      print('모든 try-catch문이 끝나고 실행되는 print문 입니다.');
  
  }

 

throw문을 쓰는 예시

해당코드는 throw문때문에 바로 catch안에 있는 코드가 실행된다.

void main() {

      try {
        throw Exception('Unknown Error');
      } on UnsupportedError catch(e, s){
        print('/ 해당 연산자는 0으로 나눌 수 없습니다.');
      } on TypeError catch(e, s){
        print('Null 값이 참조 되었습니다.');
      } catch(e, s){
        print('모르는 에러가 발생했습니다.');
        // 이미 잡아놓은 Error를 다시 던져주는 형태이다.
        rethrow;
      }

      print('모든 try-catch문이 끝나고 실행되는 print문 입니다.');
  
  }