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

PHP 예외 처리

PHP 예외 처리 — 중급

예외 처리

1. 도입 (왜 배워야 하는가)

예외 처리는 프로그래밍에서 필수적인 주제입니다. 실무에서는 예상치 못한 오류가 발생할 수 있으며, 이를 적절하게 처리하지 않으면 애플리케이션이 비정상적으로 종료되거나 사용자에게 불편을 초래할 수 있습니다. 예를 들어, 쇼핑몰에서 결제 과정 중 서버 오류가 발생하면 사용자는 결제가 제대로 이루어지지 않은 것으로 오해할 수 있습니다. 이러한 상황을 방지하기 위해 예외 처리를 통해 오류를 관리하고 사용자에게 친숙한 경험을 제공하는 것이 중요합니다.

예외 처리를 사용하지 않으면 다음과 같은 문제가 발생할 수 있습니다:

  • 프로그램이 갑자기 종료되어 데이터 손실이 발생할 수 있습니다.
  • 사용자에게 불친절한 에러 메시지가 출력되어 신뢰를 잃을 수 있습니다.
  • 디버깅이 어려워져 코드 유지보수가 어려워집니다.
  • 2. 핵심 개념 설명

    예외 처리의 핵심 개념은 try, catch, throw, finally입니다. 각각의 개념을 이해하는 것이 중요합니다.

  • try: 오류가 발생할 가능성이 있는 코드를 감싸는 블록입니다. 마치 위험한 작업을 안전하게 하도록 보호하는 장비와 같습니다.
  • catch: try 블록에서 발생한 예외를 처리하는 부분입니다. 예외가 발생하면 catch 블록으로 제어가 넘어갑니다.
  • throw: 명시적으로 예외를 발생시키는 키워드입니다. 특정 조건에서 오류가 발생했음을 알릴 때 사용합니다.
  • finally: 예외 발생 여부와 관계없이 항상 실행되는 블록입니다. 자원 해제와 같은 작업에 사용됩니다.
  • 용어설명
    try오류가 발생할 수 있는 코드 블록
    catch오류를 처리하는 코드 블록
    throw예외를 발생시키는 키워드
    finally항상 실행되는 코드 블록

    3. 기본 코드 예제

    아래는 PHP에서 예외 처리를 사용하는 가장 기본적인 코드 예제입니다.

    <?php
    function divide($numerator, $denominator) {
        if ($denominator == 0) {
            throw new Exception("0으로 나눌 수 없습니다."); // 예외를 발생시킴
        }
        return $numerator / $denominator; // 나눗셈 수행
    }
    
    try {
        echo divide(10, 0); // 예외 발생
    } catch (Exception $e) {
        echo '예외가 발생했습니다: ' . $e->getMessage(); // 예외 처리
    }
    ?>

    실행 결과

    예외가 발생했습니다: 0으로 나눌 수 없습니다.

    코드 한 줄씩 동작 설명

    1. function divide($numerator, $denominator) { ... }: 나눗셈을 수행하는 함수를 정의합니다.
    2. if ($denominator == 0) { ... }: 분모가 0인지 확인합니다.
    3. throw new Exception("0으로 나눌 수 없습니다.");: 분모가 0일 경우 예외를 발생시킵니다.
    4. return $numerator / $denominator;: 나눗셈을 수행하고 결과를 반환합니다.
    5. try { ... }: 예외 발생 가능성이 있는 코드를 감쌉니다.
    6. echo divide(10, 0);: 분모가 0인 경우 호출하여 예외를 발생시킵니다.
    7. catch (Exception $e) { ... }: 발생한 예외를 잡아서 처리합니다.
    8. echo '예외가 발생했습니다: ' . $e->getMessage();: 사용자에게 에러 메시지를 출력합니다.
    9. 4. 실전 활용 예제

      예제 1: 쇼핑몰 결제 처리

      쇼핑몰에서 고객의 결제 정보를 처리할 때 예외 처리를 사용할 수 있습니다.

      <?php
      function processPayment($amount) {
          if ($amount <= 0) {
              throw new Exception("결제 금액이 올바르지 않습니다."); // 금액 유효성 검사
          }
          // 결제 처리 로직...
          return "결제가 완료되었습니다."; // 성공 메시지
      }
      
      try {
          echo processPayment(-100); // 잘못된 금액으로 예외 발생
      } catch (Exception $e) {
          echo '결제 오류: ' . $e->getMessage(); // 오류 메시지 출력
      }
      ?>

      예제 2: 파일 읽기

      파일에서 데이터를 읽을 때 파일이 존재하지 않거나 읽을 수 없는 경우를 처리합니다.

      <?php
      function readFileContent($fileName) {
          if (!file_exists($fileName)) {
              throw new Exception("파일이 존재하지 않습니다."); // 파일 존재 여부 확인
          }
          return file_get_contents($fileName); // 파일 내용 반환
      }
      
      try {
          echo readFileContent("non_existent_file.txt"); // 존재하지 않는 파일로 예외 발생
      } catch (Exception $e) {
          echo '파일 오류: ' . $e->getMessage(); // 오류 메시지 출력
      }
      ?>

      5. 흔한 실수와 주의사항

      실수 1: 예외를 잡지 않음

      예외를 발생시키고도 이를 잡지 않으면 프로그램이 종료됩니다.

      잘못된 코드:

      echo divide(10, 0); // 예외 발생, 잡지 않음

      올바른 코드:

      try {
          echo divide(10, 0); // 예외 발생, try로 감쌈
      } catch (Exception $e) {
          echo '예외가 발생했습니다: ' . $e->getMessage(); // 처리
      }

      실수 2: 모든 예외를 한 곳에서 처리

      모든 예외를 한곳에서 처리하면 구체적인 오류를 알기 어렵습니다.

      잘못된 코드:

      try {
          // 여러 코드
      } catch (Exception $e) {
          echo '오류 발생'; // 구체적인 정보 없음
      }

      올바른 코드:

      try {
          // 여러 코드
      } catch (SpecificExceptionType $e) {
          echo '특정 오류 발생: ' . $e->getMessage(); // 구체적인 정보 출력
      }

      6. 정리

    10. 예외 처리는 프로그램의 안정성을 높여주며 사용자 경험을 개선합니다.
    11. try, catch, throw, finally의 이해가 필수적입니다.
    12. 예외를 적절하게 처리하여 오류 발생 시 사용자에게 친절한 메시지를 제공해야 합니다.
    13. 다음에 학습하면 좋은 주제는 에러 로깅입니다. 이를 통해 예외 발생 원인을 추적하고 분석할 수 있습니다.