Dart / Flutter 에러 핸들링
예외(exception)
예외는 예상하지 못한 일이 발생했다는 것을 의미하는 에러입니다. 예외가 캐치되지 않았다면, 예외를 발생시키는 isolate가 지연된 상태이고 보통 해당 isolate나 프로그램이 종료됩니다.
Dart는 미리 정의된 다양한 서브타입과 함께 Exception과 Error 타입을 제공합니다. 원하는 예외를 정의하는 것도 가능합니다. 그러나 Dart 프로그램은 Exception이나 Error 객체 이외에도 모든 non-null 객체를 예외로 발생할 수 있습니다.
throw
예외를 throwing 또는 raising합니다.
throw FormatException('Expected at least 1 section');
// 임의의 객체도 throw 할 수 있습니다.
throw 'Out of llamas!';
예외를 발생시키는 것은 표현식이기 때문에, 표현식을 사용할 수 있는 곳이라면 => 구문을 사용하여 예외를 발생시킬 수 있습니다.
void distanceTo(Point other) => throw UnimplementedError();
catch
예외를 catching 또는 capturing 하는 것은 예외가 전파되는 것을 막아줍니다.(막지 않는다면 예외를 rethrow합니다.) 예외를 캐치하면 해당 예외를 처리할 수 있습니다.
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}
한 개 이상의 예외 타입을 발생시키는 코드를 처리할 때 다수의 catch 절을 사용할 수 있습니다. 발생된 객체의 타입을 매치하는 첫 번째 catch절은 해당 예외를 처리합니다. catch 절에 타입을 명시하지 않는다면, 해당 절은 발생되는 모든 타입의 예외를 처리할 수 있습니다.
try {
breedMoreLlamas();
} on OutOfLlamasException {
// 특정한 예외
buyMoreLlamas();
} on Exception catch (e) {
// Exception 타입인 예외
print('Unknown exception: $e');
} catch (e) {
// 타입을 정하지 않은 catch 절로 모든 예외를 처리
print('Something really unknown: $e');
}
예외 타입을 특정해야할 때 on을 사용하세요. 예외 핸들러가 객체를 필요로 할 때 catch를 사용하세요. on과 catch 모두 사용할 수 있습니다.
catch()에 하나 또는 두개의 매개변수를 전달할 수 있습니다. 첫 번째는 발생될 예외이고, 두번째는 스택 트레이스(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 절을 사용하세요. catch 절과 매치되는 예외가 없다면, 예외는 finally 절 실행 이후로 전파됩니다.
try {
breedMoreLlamas();
} catch (e) {
print('Error: $e'); // 예외를 먼저 처리합니다.
} finally {
cleanLlamaStalls(); // 다음 실행, 예외가 발생되더라도 항상 실행됩니다.
}
assert
개발 중에는 assert 문을 사용합니다. - assert(조건, 선택적 메시지) - 부울 조건이 거짓인 경우 정상적인 실행을 방해합니다.
// 변수에 null이 아닌 값이 있는지 확인합니다.
assert(text != null);
// 값이 100미만인지 확인합니다.
assert(number < 100);
// https url 인지 확인합니다.
// 메시지를 추가하려면 두번째 파라미터에 문자열을 추가합니다.
assert(urlString.startsWith('https'),
'URL ($urlString) should start with "https".');