guricode

Dart - 예외 처리 본문

앱/Flutter&Dart

Dart - 예외 처리

agentrakugaki 2025. 6. 25. 20:04

Dart에서 예외(Exception)는 프로그램 실행 중 문제가 발생했을 때 이를 알려주는 메커니즘이다. 예외를 처리하지 않으면 프로그램은 종료되지만, 적절히 처리하면 문제 없이 정상적으로 실행을 이어갈 수 있다.


예외란 무엇인가

  • 예외는 프로그램 실행 중 발생하는 비정상 상황을 나타낸다.
  • 처리하지 않으면 프로그램이 중단된다.
  • Dart에서는 Exception 클래스를 상속받아 예외를 정의한다.
  • Exception("에러 메시지")처럼 예외 객체를 생성할 수도 있지만, 어떤 종류의 예외인지 알 수 없다.
var exception = Exception("이렇게 하면 어떤 예외인지 모름");

Dart에서 정의한 주요 예외들

▶ DeferredLoadException

필요한 시점에 로드되도록 설정된 라이브러리를 로드하지 못했을 때 발생한다.

DeferredLoadException(String message)

▶ FormatException

데이터가 처리 가능한 형식이 아닐 때 발생한다. (예: 문자열을 int.parse()로 정수로 바꿀 수 없을 때)

FormatException([String message = "", dynamic source, int? offset])

▶ IOException

입출력 동작 중 문제가 발생했을 때 던져진다.

IOException()

▶ OSError

운영체제 관련 예외이다.

OSError([String message = "", int errorCode = noErrorCode])
  • message에는 운영체제가 제공하는 예외 설명이 들어가며, 없으면 빈 문자열이다.
  • errorCode에는 운영체제 오류 코드가 들어간다.

▶ TimeoutException

비동기 작업 중 일정 시간 동안 결과를 받지 못했을 때 발생한다.

TimeoutException(String? message, [Duration? duration])

사용자 정의 예외

직접 예외 클래스를 만들어서 특정 상황에 맞는 예외를 만들 수 있다.
Exception 클래스를 구현(implements)하거나 상속받아 작성한다.

class AgeException implements Exception {
  final String? message;
  AgeException(this.message);

  @override
  String toString() => message ?? 'AgeException이 발생했어요!';
}

사용자 정의 예외 사용 예시

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);
  }
}
  • printAge()에서 음수일 경우 예외를 던지고,
  • main()에서 이를 catch로 받아 출력한다.

예외 처리 키워드

▶ try

예외가 발생할 수 있는 코드를 감싸는 블록이다. 예외가 발생하면 catch 또는 on 블록으로 이동한다.

▶ catch

try 블록 안에서 예외가 발생했을 때 실행되는 블록이다.

try {
  // 예외 발생 가능 코드
} catch (e) {
  print(e);
}

▶ on

특정 타입의 예외만 따로 처리하고 싶을 때 사용한다. catch와 함께 쓰는 것이 일반적이다.

on IOException catch (e) {
  print('입출력 예외: $e');
}

▶ finally

예외 발생 여부와 상관없이 항상 실행되는 블록이다. 리소스 정리나 종료 로그 출력 등에 사용된다.


 try-catch-finally 예제

try {
  String validNumber = "123";
  int result = int.parse(validNumber);
  print(result);
} catch (e) {
  print(e);
} finally {
  print('예외 처리 끝 -');
}
try {
  String invalidNumber = "abc";
  int result = int.parse(invalidNumber);
  print(result);
} on FormatException catch (e) {
  print(e);
} catch (e) {
  print(e);
}

예외 강제로 발생시키기 - throw

예외를 명시적으로 발생시킬 수 있다.
Exception, Error, 혹은 이를 상속한 객체를 throw 한다.

void printAge(int age) {
  if (age < 0) {
    throw Exception('나이는 0 이상이어야 해요!');
  }
  print(age);
}

void main() {
  try {
    printAge(8);
  } on Exception catch (e) {
    print(e);
  }
}

정리

키워드 설명

try 예외가 발생할 수 있는 코드 블록
catch 예외가 발생했을 때 처리하는 블록
on 특정 타입의 예외를 구분해서 처리할 때 사용
finally 예외 발생 여부와 관계없이 항상 실행되는 블록
throw 예외를 직접 발생시킬 때 사용

예외 처리는 프로그램의 안정성을 높이고, 예상치 못한 상황에 유연하게 대응하기 위해 필수적인 요소이다. Dart에서도 다양한 예외 처리 방법을 지원하므로 익숙해지는 것이 중요하다.