Dart의 예외 처리란?
Dart에서 프로그램 실행 중 발생하는 오류를 예외(Exception)라고 합니다. 예외를 적절하게 처리하지 않으면 프로그램이 비정상적으로 종료될 수 있습니다. 이를 방지하기 위해 try-catch문을 사용하여 예외를 처리할 수 있습니다.
Dart에서 try-catch문의 기본 구조
Dart에서 try-catch문의 기본 구조는 다음과 같습니다:
void main() {
try {
// 예외가 발생할 가능성이 있는 코드
} catch (e) {
// 예외 발생 시 실행될 코드
}
}
위 코드에서 try 블록 내부에 실행할 코드를 작성하고, catch 블록에서 예외를 처리합니다.
try-catch문 사용 예제
1. 기본적인 예외 처리
void main() {
try {
List<int> numbers = [1, 2, 3];
print(numbers[5]); // 존재하지 않는 인덱스 접근
} catch (e) {
print("예외 발생: $e");
}
}
실행 결과 :
예외 발생: RangeError (index): Index out of range: index should be less than 3: 5
위 코드에서 존재하지 않는 인덱스를 접근했을 때 'RangeError' 예외가 발생하여 catch 블록에서 예외를 처리합니다.
2. on 키워드를 사용한 특정 예외 처리
void main() {
try {
List<int> numbers = [1, 2, 3];
print(numbers[5]); // 존재하지 않는 인덱스 접근
} on RangeError {
print("잘못된 인덱스 접근입니다.");
}
}
실행 결과 :
잘못된 인덱스 접근입니다.
on 키워드를 사용하여 RangeError 예외를 특정하여 처리할 수 있습니다. 이렇게 하면 프로그램의 안정성을 높일 수 있습니다.
3. Stack trace를 포함한 예외 처리
void main() {
try {
List<int> numbers = [1, 2, 3];
print(numbers[5]); // 존재하지 않는 인덱스 접근
} catch (e, stackTrace) {
print("예외 발생: \$e");
print("Stack trace: \n\$stackTrace");
}
}
실행 결과 :
예외 발생: RangeError (index): Index out of range: index should be less than 3: 5
Stack trace:
$stackTrace
예외 발생 시 stackTrace를 활용하면 오류의 원인을 더 쉽게 찾을 수 있습니다.
4. finally 블록 사용
finally 블록은 예외 발생 여부와 관계없이 항상 실행되는 코드 블록입니다.
void main() {
try {
List<int> numbers = [1, 2, 3];
print(numbers[5]); // 존재하지 않는 인덱스 접근
} on RangeError {
print("잘못된 인덱스 접근입니다.");
} finally {
print("프로그램이 종료되었습니다.");
}
}
실행 결과 :
잘못된 인덱스 접근입니다.
프로그램이 종료되었습니다.
finally 블록은 리소스 해제나 로그 기록 등의 용도로 활용됩니다.
Dart의 예외 처리 Best Practice
- 일반적인 예외를 catch할 때 Exception을 사용하자
- 특정 예외를 on 키워드로 처리하자
- finally 블록을 활용하여 리소스 정리하기
- Stack trace를 활용하여 디버깅을 쉽게 하자
결론
Dart에서 예외 처리는 프로그램의 안정성을 높이는 중요한 요소입니다. try-catch문을 사용하면 프로그램이 예외 상황에서도 안전하게 실행될 수 있습니다. on 키워드로 특정 예외를 처리하면 더욱 정밀한 예외 처리가 가능하며, finally 블록을 활용하여 리소스를 정리하는 것이 좋은 습관입니다.