2025-09-26
Dart의 주요 예외 (Exception)
DeferredLoadException
필요한 시점에 라이브러리를 로드하지 못했을 때 발생
FormatException
데이터가 처리 가능한 형태가 아니어서 파싱/처리할 수 없을 때 발생
IOException
입출력 관련 동작 중 발생하는 오류
- FileSystemException : 파일에 접근할 수 없는 경우
- HttpException : HTTP 요청/응답 중 오류 발생
- ProcessException : 프로세스 실행/종료 중 오류
- SignalException : 프로세스 신호 관련 오류
- SocketException : 네트워크 소켓 연결 오류
OSError
운영체제 레벨에서 발생하는 오류
TimeoutException
비동기 결과를 기다리는 동안 지정된 시간이 초과되었을 때 발생
사용자가 직접 정의한 예외
Exception을 상속받는 예외클래스 생성 후, try-catch 문 안에서 throw로 던져준다.
class AgeException implements Exception {
final String? message;
AgeException(this.message);
}
void printAge(int age) {
if (age < 0) {
throw AgeException(null);
}
print(age);
}
void main() {
try {
printAge(-8);
} catch (e) {
print(e);
}
}
throw
예외를 상위 로직으로 던질때 try-catch문 안에서 throw를 사용한다.
catch
catch에서는 예외를 다루며, 여러개 가질 수 있다.
on 예외클래스 catch (e) { }
다트에서는 코틀린과 달리 catch (e: 예외클래스) { }처럼 뒤에 타입을 지정하는 방식은 지원하지않는다. on 키워드를 사용해야한다.
Dart의 주요 에러 (Error)
Error란? 주로 프로그램 외부의 환경이나 시스템 레벨에서 발생하는 심각한 문제
모든 종류의 오류는 Error 클래스를 상속 받아서 구성된다.
ArgumentError
허용되지 않는 인자를 함수에 전달
AssertionError
assert() 문에 전달된 조건이 거짓일 때 발생. 논리적인 오류를 조기에 발견하는 용도로 활용된다.
assert(age > 0, 'Age must be positive');
RangeError
허용되지 않는 범위의 값이 매개변수로 전달. (예: 배열 인덱스가 범위를 벗어날 때)
ArgumentError 클래스를 상속받은 클래스이다.
IndexError
허용되지 않는 범위의 Index 를 사용. (Dart에서는 -1 인덱스 접근이 접근이 안됨)
RangeError 클래스를 상속받은 클래스이다.
NoSuchMethodError
존재하지 않는 함수나 메서드를 호출.
OutOfMemoryError
프로그램이 시스템 메모리를 과도하게 사용하여 더 이상 메모리를 할당할 수 없음.
StackOverflowError
스택(Stack) 영역이 수용 가능한 범위를 넘어설 때 발생.
메모리 공간의 4가지 영역:
- 코드(Code): 실행할 코드가 저장되는 공간. 프로그램 시작부터 종료까지 유지됨.
- 데이터(Data): 전역 변수나 정적 변수가 저장되는 공간. 프로그램 시작부터 종료까지 유지됨.
- 힙(Heap): 개발자가 직접 할당/해제할 수 있는 동적인 공간, 프로그램 실행 중에 크기가 결정됨.
- 스택(Stack): 지역 변수나 매개변수가 저장되는 공간. 그 변수가 속한 코드 블록의 실행이 끝나면 메모리 해제됨.
StateError
객체의 현재 상태로는 특정 동작을 수행할 수 없을 때 발생. (예: 빈 리스트에서 first를 호출할 때)
List<int> numbers = [];
print(numbers.first);
TypeError
예상한 타입과 실제 타입이 맞지 않을 때 발생. (예: String을 as로 double로 강제 변환하려고 할 때)
String b = '2';
print(b as double);
UnimplementedError
아직 구현되지 않은 메서드나 기능을 호출했을 때 발생.
UnsupportedError
객체를 통해 실행될 수 없는 동작을 시도했을 때 발생. (예: const 리스트에 요소를 추가하려는 경우)
String b = '2';
print(b as double);
사용자 정의 오류
Error 클래스를 상속받아서 만든다.
class AgeError extends Error {
final String? message;
AgeError(this.message);
@override
String toString() => message ?? 'AgeError 가 발생했어요 !';
}
예외 vs 에러
예외 는 코드가 논리적으로 맞지 않거나 적절하지 않은 값이 입력되었을 때 발생하고,
오류 는 주로 시스템에 문제가 생겼을 때 (ex. 메모리 부족) 발생한다.
예외 는 try-catch 를 통해 처리할 수 있지만,
오류 는 발생을 예상할 수 없기 때문에 처리할 수 없다.