프로그램을 설계할 때
실행시에 예외 상황이 발생 할 가능성이 있는 것을 예측하여, 사전에 예외 처리가 되도록 할 필요가 있음.
이럴 때 적절한 조치가 없으면 프로그램은 에러가 나며 죽어 버림.
throw 문은 사용자 정의 예외를 발생(throw)할 수 있다.
//예외를 throwing 또는 raising 하는 코드입니다.
throw FormatException('Expected at least 1 section');
임의의 객체도 throw 할 수 있다.
throw 'Out of llamas!';
예외를 발생시키는 것은 표현식이기 때문에, 표현식을 사용할 수 있는 곳이라면, => 구문을 사용하여 예외를 발생시킬 수 있다.
void distanceTo(Point other) => throw UnimplementedError();
예외를 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 사용. catch와 매치되는 예외가 없다면, 예외는 finally 실행 이후로 전파된다.
try {
breedMoreLlamas();
} finally {
// 예외가 발생되더라도, 항상 실행됩니다.
cleanLlamaStalls();
}
finally은 일치하는 catch 다음에 실행된다.
에러
예외의 종류
예외 처리