예외 처리
포스트
취소

예외 처리

오류와 예외

  • 오류 (error)
    • 시스템 레벨에서 프로그램에 심각한 문제를 야기하여 실행 중인 프로그램을 종료시키는 것
    • 개발자가 미리 예측하여 처리할 수 없는 것이 대부분이라서 오류에 대한 처리는 할 수 없다.
  • 예외 (exception)
    • 오류와 마찬가지로 실행 중인 프로그램을 비정상적으로 종료시킨다.
    • 발생할 수 있는 상황을 미리 예측하여 처리할 수 있다.
    • 개발자는 예외 처리(exception handling)를 통해 예외 상황을 처리할 수 있도록 코드의 흐름을 바꿀 필요가 있다.

예외 처리

  • try 블록
    • 기본적으로 맨 먼저 실행되는 코드로 여기에서 발생한 예외는 on 블록에서 처리된다.
    • 필수적으로 사용
    • 1번만 선언할 수 있다.
  • on 블록
    • try 블록에서 발생한 예외 코드나 예외 객체를 인수로 전달받아 그 처리를 담당한다.
    • 선택적으로 사용
    • 여러 번 선언할 수 있다.
    • 예외가 발생하면, try 블록과 가장 가까운 on 블록부터 순서대로 검사한다. (★)
  • catch 블록
    • 발생한 예외에 대한 정보를 다룬다.
    • 예외 핸들러가 예외 객체를 필요로 할 때 사용한다.
    • 2가지 매개변수를 다룬다.
      • 첫번째 매개변수
        • 발생될 예외
      • 두번째 매개변수
        • StackTrace 객체
    • on 블록과 함께 사용할 수 있다.
  • finally 블록
    • 이 블록은 try 블록에서 예외가 발생하건 안 하건 맨 마지막에 무조건 실행된다.
    • 선택적으로 사용
    • 1번만 선언할 수 있다.

on/try/finally 블록 중 1개는 있어야 한다.

사용 방법

//기본 형식 1
try {
  //처리 내용
} on 특정예외 {
  //특정한 예외에 대한 처리 내용
}

//기본 형식 2
try {
  //처리 내용
} on 특정예외 catch (e, s) {
  //특정한 예외에 대한 처리 내용
  //예외 객체에 대한 처리 내용
}

//기본 형식 3
try {
  //처리 내용
} catch (e, s) {
  //예외 객체에 대한 처리 내용
}

//기본 형식 4
try {
  //처리 내용
} finally {
  //예외가 발생되더라도 항상 실행될 내용
}

예외 제어

throw 키워드

  • 해당 예외를 강제로 발생시킨다.
//s:기본 형식
    throw 예외종류(전달할_데이터);
//e:기본 형식

//s:사용 예시
    try{
        throw Exception("예외 강제 발생");
    } on Exception catch (e, s) {
        print(e.toString()); //※1
        print(s.toString()); //※2
    }
//e:사용 예시

※1

Exception: 예외 강제 발생

※2

Exception: 예외 강제 발생
at Object.wrapException (:427:43) at main (:2813:17) at :3364:7 at :3347:7 at dartProgram (:3358:5) at :3366:3 at replaceJavaScript (https://dartpad.dev/scripts/frame.js:19:19) at messageHandler (https://dartpad.dev/scripts/frame.js:100:13)

rethrow 키워드

  • 발생한 예외에 대해서 전파하는 키워드
  • 사용 예시
//s:예외 발생용 메소드 선언
    void test() {
    try {
        throw Exception();
    } catch (e) {
        print('error in test method');
        rethrow;
    }
    }
//e:예외 발생용 메소드 선언

//s:선언한 메소드 호출
    try {
        test();
    } catch (e) {
        print('error in main method');
    }
//e:선언한 메소드 호출

//출력
/*
    error in test method
    error in main method
*/

디버깅 함수

  • 조건식을 통해서 디버깅을 진행한다.
  • 조건식의 결과가 false일 경우 예외를 발생시킨다.
    • AssertionError
  • 두번째 인자에 메시지를 넣으면 조건식의 결과가 false일때 해당 메시지가 출력된다.
//s:기본 형식
    assert(조건식, "조건식이 거짓인 경우의 오류 메시지");
//e:기본 형식

//s:사용 예시
    int a = 1;
    int b = 2;
    assert(a == b, "불일치");

    //출력
    /*
        Uncaught Error: Assertion failed: "불일치"
    */
//e:사용 예시
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.