오류와 예외
- 오류 (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:사용 예시