Top

Up

예외 (Exceptions)

Dart 코드는 예외를 던지고 잡을 수 있습니다. 예외는 예상치 못한 일이 발생했음을 나타내는 오류를 나타냅니다. 예외를 잡지(catch) 않으면, 예외를 발생시킨 격리(isolate)가 일시 중단(suspend)되며, 일반적으로 격리(isolate) 및 해당 프로그램이 종료됩니다.

Java와 달리 Dart의 모든 예외는 unchecked exceptions입니다. 메서드는 throw 할 수 있는 예외를 선언하지 않으며 예외를 catch 할 필요가 없습니다.

Dart는 ExceptionError를 제공합니다. 물론 할 수 있다면 예외를 정의할 수 있습니다. 그러나 다트 프로그램은 Exception 및 Error 객체뿐만 아니라 모든 null이 아닌 객체를 예외로 throw 할 수 있습니다.

throw

다음은 예외를 throw하거나 raise 하는 예제입니다.

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

임의의 객체를 throw 할 수도 있습니다.

throw 'Out of llamas!';

Note: 프로덕션 수준의 코드는 일반적으로 Error 또는 Exception를 구현하는 타입을 throw합니다.

예외를 던지기 (throwing)는 표현식이므로, => 명령문에서 뿐만 아니라 표현식을 허용하는 다른 곳에서도 예외를 던질 수 있습니다 :

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

catch

예외를 catch 하거나 캡처하면 예외를 다시 발생시키지 않는 한 전파되는 것을 중지합니다. 예외를 catch하면 다룰 수 있습니다.

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');
}

역자주: 위 예제에서 9번째 라인처럼 모든 예외를 잡는 코드는 위험하며, 처리되지 않은 예외는 반드시 다시 던질 것을 권합니다.

앞의 코드에서 볼 수 있듯이 on 또는 catch 또는 둘 다 사용할 수 있습니다. 예외 타입을 지정할 필요가 있을 때 on을 사용하십시오. 예외 처리기가 예외 객체를 필요로 할 때 catch를 사용하십시오.

catch()에 하나 또는 두 개의 매개 변수를 지정할 수 있습니다. 첫 번째 예외는 throw 된 예외이며 두 번째는 StackTrace입니다 (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++); // 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

예외가 발생했는지 여부에 관계없이 일부 코드가 실행되도록하려면 finally 절을 사용하십시오. 예외와 일치하는 catch 절이 없으면 finally 절이 실행 된 후에 예외가 전파됩니다.

try {
  breedMoreLlamas();
} finally {
  // Always clean up, even if an exception is thrown.
  cleanLlamaStalls();
}

finally 절은 일치하는catch 절 이후에 실행됩니다 :

try {
  breedMoreLlamas();
} catch (e) {
  print('Error: $e'); // Handle the exception first.
} finally {
  cleanLlamaStalls(); // Then clean up.
}

라이브러리 둘러보기의 Exception 섹션을 읽어보세요.


이전: 흐름 제어문 (Control flow statements)

다음: 클래스 (Classes)

문서 변경 이력

2019년 5월 15일: 첫 작성.