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 |