오류 처리 (Error Handling)
- Java 와 달리 Dart 의 모든 예외는 Unchecked 예외임
- 메서드는 어떤 예외를 던질지 선언하지 않으며, 예외 처리가 강제되지 않는다.
- 다양한
Error
와Exception
객체를 내부적으로 제공하고, 직접 정의할 수도 있다.Error
와Exception
객체가 아니어도 어떤 객체든 예외로 던질 수 있다.
- 단, 프로덕션 코드에서는
Error
와Exception
을 구현한 타입을 주로 예외로 던진다.
throw
throw FormatException('Expected at least 1 section');
throw 'Just throw string';
- 화살표 함수 등 어디에서도 예외를 던질 수 있다.
void distanceTo(Point other) => throw UnimplementedError();
catch
on
으로 특정 타입의 예외를 먼저 잡아 처리할 수 있다.- 마지막에 정말 어떻게 처리할지 모르는 예외를
catch
로 빼둘 수 있다.- 타입을 지정하지 않은
catch
는 모든 타입을 처리한다.
- 타입을 지정하지 않은
try {
breedMoreLlamas();
} on OutOfLlamasException {
// A specific exception
buyMoreLlamas();
} on Exception catch (e) {
// Anything else that is an exception
print('Unknown exception: $e');
} catch (e) {
// No specified type, handles all
print('Something really unknown: $e');
}
catch
내부에서 이용할 수 있는 객체들
catch
내부에서는 예외(Exception
) 객체와 StackTrace 객체를 이용할 수 있다.- 다른 언어와 마찬가지로
StackTrace
객체는 Call sequence 를 보고 싶을 때 이용할 수 있다.
try {
// ···
} on Exception catch (e) {
print('Exception details:\n $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}
rethrow
- 다시 상위 단계로
Exception
을 던지고 싶을 때 사용할 수 있다. - 예외 중 일부를 처리하고 일부를 상위 클래스에 넘길 수 있다.
void misbehave() {
try {
dynamic foo = true;
print(foo++); // Runtime error
} catch (e) {
print('misbehave() partially handled ${e.runtimeType}.');
rethrow; // Allow callers to see the exception.
}
}
void main() {
try {
misbehave();
} catch (e) {
print('main() finished handling ${e.runtimeType}.');
}
}
finally
catch
와 상관 없이 실행시키고 싶은 코드 블럭이 있다면 사용- 일반적으로 리소스 정리 등에 많이 사용된다.
try {
breedMoreLlamas();
} catch (e) {
print('Error: $e'); // Handle the exception first.
} finally {
cleanLlamaStalls(); // Then clean up.
}
Assert
- 개발할 때 유용하다.
- 조건을 만족하는 값들이 넘어오는지 확인할 때 유용하다.
- Flutter 에서는 디버그 모드에서 Assertion 이 활성화된다.
- webdev serve 와 같은 개발 전용 도구에서도 기본으로 Assertion 을 활성화시킨다.
- 프로덕션 코드에서는 Assertion 은 무시되고, Assertion 인수가 평가되지 않는다.
// Make sure the variable has a non-null value.
assert(text != null);
// Make sure the value is less than 100.
assert(number < 100);
// Make sure this is an https URL.
assert(urlString.startsWith('https'));
assert(urlString.startsWith('https'),
'URL ($urlString) should start with "https".');
반응형
'Dart' 카테고리의 다른 글
다트 (Dart) 언어의 생성자 (Constructors) 정리 (0) | 2023.10.13 |
---|---|
다트(Dart) 언어의 클래스(Class) 정리 (0) | 2023.10.12 |
다트(Dart) 언어의 클래스 제어자 (Class modifier) 정리 (0) | 2023.10.12 |
다트(Dart) 언어의 확장 메서드 (Extension methods) 정리 (0) | 2023.10.10 |
다트 (Dart) 변수, 상수 선언 방식 (0) | 2023.10.08 |