Flutter Study Day 9 Dart Exception

정정원·2023년 12월 11일
0

Flutter Study

목록 보기
11/17

예외

프로그램을 설계할 때
실행시에 예외 상황이 발생 할 가능성이 있는 것을 예측하여, 사전에 예외 처리가 되도록 할 필요가 있음.
이럴 때 적절한 조치가 없으면 프로그램은 에러가 나며 죽어 버림.

에러의 종류

  • 문법 에러 (syntax error)
  • 실행 시 에러 (runtime error)
  • 논리 에러 (logic error)

Throw

throw 문은 사용자 정의 예외를 발생(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();
} finally {
  // 예외가 발생되더라도, 항상 실행됩니다.
  cleanLlamaStalls();
}

finally은 일치하는 catch 다음에 실행된다.

예외 정리

에러

  • syntax error, runtime error, logic error 의 3종류
  • 예외처리를 할 때는, runtime error를 대처한다.

예외의 종류

  • API에는 여러가지 예외적 상황을 표현하는 예외 클래스가 준비되어 있다.
  • 예외 클래스를 상속하여 오리지날 예외 클래스를 정의할 수 있다.

예외 처리

  • try-catch 문을 사용하면, try 블록 내에 예외가 발생했을 때 catch 블록에서 처리가 옮겨진다.
  • finally 블록으로 나중에 꼭 해야하는 처리를 할 수 있다.
  • throw 문을 사용하면 임의로 예외를 발생시킬 수 있다.

0개의 댓글