반응형

Dart, 예외 처리 try ~ catch

 

글. 수알치 오상문 

 

Dart 코드는 예외를 발생시키고 잡아낼 수 있습니다. 예외는 예기치 않은 일이 발생했다는 오류입니다. 잡아내지 못한 예외가 발생하면 해당 프로그램이 종료될 수 있습니다.

 

참고: 예외 Exception, 에러 Error 유형,

 

사용자 예외를 만들 수도 있습니다. 다트 프로그램은 Exception 및 Error 객체뿐만 아니라 null이 아닌 객체를 예외로 던질 수(throw) 있습니다.

 

throw

 

다음은 예외를 던지거나 발생시키는 예입니다.

 

throw FormatException('Expected at least 1 section');

 

임의의 개체를 던질 수도 있습니다.

 

throw 'Out of llamas!';

 

예외를 던지는 것은 표현식이므로 => 문이나 표현식을 허용하는 모든 곳에서 예외를 던질 수 있습니다.

 

void distanceTo(Point other) => throw UnimplementedError();

 

catch

 

예외를 잡아내면 예외를 다시 throw하지 않는 한 예외가 다른 곳으로 넘어가지 않습니다. 즉, 예외를 포착하면 처리할 수있는 기회가 제공됩니다.

 

try {

  breedMoreLlamas();

on OutOfLlamasException {

  buyMoreLlamas();

}

 

한개 이상의 catch 부분을 지정할 수 있습니다.던져진(throw) 객체의 유형과 일치하는 catch에서 예외를 처리합니다. catch 부분에 에러 유형을 지정하지 않으면 던져진 모든 유형의 에러 객체를 처리할 수 ​​있습니다.

 

try {

  breedMoreLlamas();

} on OutOfLlamasException   // 특정한 예외

  buyMoreLlamas();

} on Exception catch (e)   // 유형이 있는 모든 예외

  print('Unknown exception: $e');

} catch (e)   // 유형 없는 모든 예외 

  print('Something really unknown: $e');

}

 

예제에서 볼 수 있듯이 on, catch 둘 다 사용할 수 있습니다. 예외 유형을 지정해야하는 경우 on을 사용합니다. 예외 처리기에 예외 객체가 필요한 경우 catch를 사용합니다.

 

catch()에 하나 또는 두 개의 매개변수를 지정할 수 있습니다. 첫째는 throw 예외이고 둘째는 스택 추적 ( StackTrace 개체)입니다.

 

try {

  // ···

} on Exception catch (e) {

  print('Exception details:\n $e');

} catch (e, s){

  print('Exception details:\n $e');

  print('Stack trace:\n $s');

}

 

예외를 처리한 다음에 그 예외를 다시 전파하려면 rethrow 키워드를 이용합니다.

 

void misbehave() {

  try {

    dynamic foo = true;

    print(foo++); // 실행시간 에러 발생

  } catch (e) {

    print('misbehave() partially handled ${e.runtimeType}.');

    rethrow; // 예외 재전파

  }

}

 

void main() {

  try {

    misbehave();

  } catch (e) {

    print('main() finished handling ${e.runtimeType}.');

  }

}

 

finally

 

예외 발생과 상관없이 무조건 실행하고 싶은 코드는 finally 부분에 작성합니다. 참고로 예외로 잡아내지 못한 예외가 있으면 재전파됩니다.  

 

try {

  breedMoreLlamas();

} finally {

  // 에러와 상관없이 마무리 정리

  cleanLlamaStalls();

}

 

inally 부분은 catch 부분 수행 후에 실행됩니다. 물론 잡힌 에러가 없어도 실행됩니다.

 

try {

  breedMoreLlamas();

} catch (e) {

  print('Error: $e'); // 에러 처리 .

} finally {

  cleanLlamaStalls(); // 마무리 

}

 

더 자세한 내용: Exceptions 

 

<이상>

반응형

'Dart' 카테고리의 다른 글

Dart, 메서드(메소드)  (0) 2021.06.17
Dart, 클래스 class  (0) 2021.06.15
Dart, 디버깅 함수 assert()  (0) 2021.06.15
Dart, 흐름 제어 if, for, while, do while, switch  (0) 2021.06.15
Dart, 연산자  (0) 2021.06.15

+ Recent posts