학습
Dart 에러 처리 심화
Dart 에러 처리 심화 — 중급
에러 처리 심화
1. 도입 (왜 배워야 하는가)
소프트웨어 개발에서 에러 처리는 매우 중요한 요소입니다. 실제로 사용자가 프로그램을 사용할 때 예기치 않은 상황이 발생할 수 있으며, 이때 적절한 에러 처리를 하지 않으면 프로그램이 비정상적으로 종료되거나 사용자가 혼란스러워할 수 있습니다. 예를 들어, 쇼핑몰 앱에서 결제 과정 중 네트워크 오류가 발생한다면, 사용자는 불안감을 느끼고 다시 결제 시도를 할 수 있어야 합니다.
에러 처리를 제대로 하지 않으면 다음과 같은 문제가 발생할 수 있습니다:
- 프로그램 크래시: 사용자에게 신뢰를 잃게 함
- 데이터 손실: 중요한 정보가 사라질 수 있음
- 사용자 경험 저하: 사용자가 프로그램 사용을 포기하게 만듦
2. 핵심 개념 설명
에러 처리의 핵심 개념은 다음과 같습니다.
| 용어 | 정의 |
|---|---|
| Exception | 프로그램 실행 중 발생할 수 있는 오류 |
| Try-Catch | 예외를 처리하기 위한 구문 |
| Finally | 예외 발생 여부와 관계없이 항상 실행되는 블록 |
| Throw | 사용자 정의 예외를 발생시킬 때 사용하는 키워드 |
실생활 비유로 설명하자면, 에러 처리는 자동차 운전 중에 발생할 수 있는 돌발 상황에 대한 안전장치와 같습니다. 예를 들어, 갑자기 고장이 나거나 신호가 바뀌는 상황에서 적절한 대처를 하지 않으면 사고가 날 수 있습니다.
3. 기본 코드 예제
void main() {
try {
int result = divide(4, 0);
print("결과: $result");
} catch (e) {
print("오류 발생: $e");
} finally {
print("프로그램 종료");
}
}
int divide(int a, int b) {
if (b == 0) {
throw Exception("0으로 나눌 수 없습니다.");
}
return a ~/ b;
}
실행 결과
오류 발생: Exception: 0으로 나눌 수 없습니다.
프로그램 종료
코드 한 줄씩 동작 설명
void main() {- 메인 함수의 시작.try {- 예외가 발생할 수 있는 코드를 감싸는 블록 시작.int result = divide(4, 0);- 4를 0으로 나누는 함수 호출 (예외 발생).print("결과: $result");- 결과 출력 (실행되지 않음).} catch (e) {- 예외가 발생할 경우 실행되는 블록 시작.print("오류 발생: $e");- 발생한 예외 메시지 출력.} finally {- 예외 발생 여부와 관계없이 실행되는 블록 시작.print("프로그램 종료");- 프로그램 종료 메시지 출력.- 잘못된 코드: 예외 발생 시 아무런 조치를 취하지 않아 문제를 숨김.
- 올바른 코드: 예외를 로그에 기록하거나 사용자에게 알림.
- 잘못된 코드: finally 블록에서 return을 사용하면, 예외 발생 여부와 관계없이 메서드가 종료됨.
- 올바른 코드: finally 블록에서는 리소스 정리 등의 작업만 수행.
- 에러 처리는 사용자의 신뢰를 얻고 프로그램 안정성을 높이는 데 필수적입니다.
- Exception, Try-Catch, Finally, Throw와 같은 개념을 이해하고 활용하는 것이 중요합니다.
- 실무에서 자주 사용하는 패턴을 통해 에러 처리를 효과적으로 적용할 수 있습니다.
- 다음에 학습하면 좋은 주제: 사용자 정의 예외 처리, 비동기 에러 처리, 에러 로깅 및 모니터링.
4. 실전 활용 예제
예제 1: 쇼핑몰에서 장바구니 구현
장바구니에 상품을 추가할 때 재고가 부족한 경우를 처리하는 예입니다.
class Product {
final String name;
final int stock;
Product(this.name, this.stock);
}
void addToCart(Product product, int quantity) {
if (quantity > product.stock) {
throw Exception("재고가 부족합니다: ${product.stock}개 남아 있습니다.");
}
print("${product.name}가 장바구니에 추가되었습니다.");
}
void main() {
Product apple = Product("사과", 5);
try {
addToCart(apple, 6);
} catch (e) {
print("오류 발생: $e");
}
}
예제 2: 파일 읽기
파일을 읽는 과정에서 파일이 존재하지 않는 경우를 처리하는 패턴입니다.
import 'dart:io';
void readFile(String filename) {
try {
File file = File(filename);
String contents = file.readAsStringSync();
print(contents);
} catch (e) {
print("파일 오류: $e");
}
}
void main() {
readFile("없는파일.txt");
}
5. 흔한 실수와 주의사항
실수 1: 예외를 무시하기
try {
int result = divide(4, 0);
} catch (e) {
// 아무것도 하지 않음
}
실수 2: Finally 블록의 오용
try {
// 코드
} catch (e) {
// 예외 처리
} finally {
return; // finally에서 return 사용
}