IMCAT.DEV
로그인 가입
Dart 중급 문법

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으로 나눌 수 없습니다.
    프로그램 종료

    코드 한 줄씩 동작 설명

    1. void main() { - 메인 함수의 시작.
    2. try { - 예외가 발생할 수 있는 코드를 감싸는 블록 시작.
    3. int result = divide(4, 0); - 4를 0으로 나누는 함수 호출 (예외 발생).
    4. print("결과: $result"); - 결과 출력 (실행되지 않음).
    5. } catch (e) { - 예외가 발생할 경우 실행되는 블록 시작.
    6. print("오류 발생: $e"); - 발생한 예외 메시지 출력.
    7. } finally { - 예외 발생 여부와 관계없이 실행되는 블록 시작.
    8. print("프로그램 종료"); - 프로그램 종료 메시지 출력.
    9. 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) {
        // 아무것도 하지 않음
      }
    10. 잘못된 코드: 예외 발생 시 아무런 조치를 취하지 않아 문제를 숨김.
    11. 올바른 코드: 예외를 로그에 기록하거나 사용자에게 알림.
    12. 실수 2: Finally 블록의 오용

      try {
        // 코드
      } catch (e) {
        // 예외 처리
      } finally {
        return; // finally에서 return 사용
      }
    13. 잘못된 코드: finally 블록에서 return을 사용하면, 예외 발생 여부와 관계없이 메서드가 종료됨.
    14. 올바른 코드: finally 블록에서는 리소스 정리 등의 작업만 수행.
    15. 6. 정리

    16. 에러 처리는 사용자의 신뢰를 얻고 프로그램 안정성을 높이는 데 필수적입니다.
    17. Exception, Try-Catch, Finally, Throw와 같은 개념을 이해하고 활용하는 것이 중요합니다.
    18. 실무에서 자주 사용하는 패턴을 통해 에러 처리를 효과적으로 적용할 수 있습니다.
    19. 다음에 학습하면 좋은 주제: 사용자 정의 예외 처리, 비동기 에러 처리, 에러 로깅 및 모니터링.