프로그래밍을 하다 보면 예상치 못한 오류나 예외 상황이 발생할 수 있습니다.
Dart에서는 이러한 예외를 효과적으로 처리하기 위해 try-catch-finally 구문을 제공합니다.
이 글에서는 Dart의 예외 처리 구조인 try-catch-finally의 개념과 활용법을 중점적으로 살펴보겠습니다.
1. 예외(Exception)란?
예외(Exception)는 프로그램 실행 중 발생하는 비정상적인 상황을 의미합니다.
이러한 예외는 프로그램의 정상적인 흐름을 방해할 수 있으며, 적절한 예외 처리가 없을 경우 프로그램이 강제 종료될 수 있습니다.
예외의 예시
- 배열의 인덱스를 벗어나는 경우
- 0으로 나누는 경우
- 파일을 찾을 수 없는 경우
- 네트워크 연결 실패
2. 예외 처리의 기본 구조: try-catch-finally
Dart에서 예외를 처리하는 기본 구조는 try-catch-finally 구문으로 구성됩니다.
- try 블록: 예외가 발생할 가능성이 있는 코드를 감싸는 블록입니다. 예외가 발생하면, 프로그램의 흐름은 catch 블록으로 넘어갑니다.
- catch 블록: 예외가 발생했을 때 실행되는 코드 블록입니다. 예외 정보를 활용하여 오류를 로그에 기록하거나 사용자에게 알림을 제공할 수 있습니다.
- finally 블록: 예외 발생 여부와 상관없이 항상 실행되는 코드 블록입니다. 리소스 해제, 파일 닫기, 네트워크 연결 종료 등의 작업을 수행할 때 유용합니다.
3. try-catch-finally 구문의 예제
아래는 try-catch-finally를 사용한 간단한 예제입니다.
void main() {
try {
int result = 10 ~/ 0; // 예외가 발생할 가능성이 있는 코드
print("Result: $result");
} catch (e) {
print("예외 발생: $e"); // 예외가 발생하면 실행되는 코드
} finally {
print("프로그램이 종료됩니다."); // 항상 실행되는 코드
}
}
위 코드에서 10 ~/ 0 연산은 0으로 나누기 때문에 IntegerDivisionByZeroException 예외가 발생합니다.
예외가 발생하면 catch 블록으로 이동하여 예외 메시지를 출력하고, finally 블록에서 프로그램 종료 메시지를 출력합니다.
4. catch 블록의 다양한 사용법
4.1 기본 예외 처리
기본적으로 catch 블록은 발생한 예외를 받아 처리하는 역할을 합니다.
try {
int result = 10 ~/ 0;
} catch (e) {
print("예외 발생: $e");
}
4.2 예외와 스택 트레이스(Stack Trace) 처리
스택 트레이스는 예외가 발생한 위치와 호출 경로를 추적하는 데 유용합니다. Dart에서는 catch 블록에서 스택 트레이스를 받아볼 수 있습니다.
try {
int result = 10 ~/ 0;
} catch (e, stackTrace) {
print("예외 발생: $e");
print("스택 트레이스: $stackTrace");
}
4.3 특정 예외 처리
Dart에서는 특정 예외 타입에 대해서만 처리할 수 있습니다. 이를 통해 예외 유형에 따른 맞춤형 예외 처리가 가능합니다.
try {
int result = 10 ~/ 0;
} on IntegerDivisionByZeroException {
print("0으로 나눌 수 없습니다.");
} catch (e) {
print("다른 예외 처리: $e");
}
위 코드에서는 0으로 나누는 상황에 대해 별도로 예외를 처리하고, 그 외의 예외는 일반적인 catch 블록에서 처리합니다.
5. finally 블록
finally 블록은 예외 발생 여부와 상관없이 항상 실행됩니다. 자원 정리와 같은 작업에 주로 사용됩니다.
void main() {
try {
int result = 10 ~/ 2;
print("Result: $result");
} catch (e) {
print("예외 발생: $e");
} finally {
print("이 블록은 항상 실행됩니다.");
}
}
finally 블록은 데이터베이스 연결 해제, 파일 닫기, 메모리 해제 등 중요한 정리 작업을 위해 사용됩니다.
6. 예외를 직접 던지기
Dart에서는 특정 상황에서 예외를 명시적으로 던질 수 있습니다. 예외를 던지는 것은 throw 키워드를 사용하여 구현됩니다.
void checkAge(int age) {
if (age < 18) {
throw FormatException("나이가 너무 어립니다.");
}
}
void main() {
try {
checkAge(15);
} catch (e) {
print("예외 발생: $e");
}
}
위 코드에서는 checkAge 함수에서 나이가 18세 미만일 경우 FormatException을 던지고, main 함수에서 이를 catch 블록으로 처리합니다.
7. 예외 처리의 베스트 프랙티스
- 명확한 예외 처리: 예외를 남발하지 않고, 필요한 곳에만 사용하세요. 예외 처리 코드는 가능한 간결하고 명확해야 합니다.
- 자원 관리: finally 블록을 활용하여 파일, 데이터베이스 연결, 네트워크 소켓 등의 자원을 적절히 정리하세요.
- 유의미한 예외 메시지: throw나 catch에서 던지거나 처리하는 예외 메시지는 유의미하고, 문제를 파악하기 쉽게 작성해야 합니다.
- 로깅: 예외 발생 시, 로그를 남겨 문제를 추적하고, 원인을 분석하는 데 도움이 되도록 합니다.
Dart에서의 예외 처리와 try-catch-finally 구문은 프로그램의 안정성을 높이는 중요한 도구입니다.
예외 처리를 통해 예상치 못한 오류에 대비하고, 자원을 안전하게 정리하며, 프로그램이 비정상적으로 종료되는 상황을 방지할 수 있습니다.
Dart의 예외 처리 구조를 잘 이해하고 활용하여 안정적인 프로그램을 개발해보세요!
구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.
Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.
'Dart > Dart Programming language' 카테고리의 다른 글
[중급] Dart 예외 처리 및 디버깅/ 디버깅 기법 및 로그 출력 방법 (0) | 2024.09.06 |
---|---|
[중급] Dart예외 처리 및 디버깅/ 커스텀 예외 생성 및 활용법 (0) | 2024.09.06 |
[중급] Dart 컬렉션과 고차 함수/ Iterable과 고차 함수: map, filter, reduce 등 완벽 이해 (0) | 2024.09.06 |
[중급] Dart 컬렉션과 고차 함수/리스트(List), 맵(Map), 세트(Set) 활용법 (0) | 2024.09.06 |
[초급] Dart 객체 지향 프로그래밍 기초: 접근 제어자: public, private, protected (0) | 2024.09.05 |