PHP Try Catch 예제: 예외 및 오류 처리 튜토리얼
⚡ 스마트 요약
PHP에서 오류 처리와 예외 처리는 예상치 못한 상황을 관리하여 애플리케이션의 안정성과 보안을 유지하는 데 도움이 됩니다. 이 가이드에서는 오류와 예외의 차이점, die 문, 사용자 정의 오류 핸들러, 오류 보고 수준, 그리고 여러 예외 유형을 사용하는 try, throw, catch 예외 모델에 대해 설명합니다.

예외란 무엇입니까?
오류는 프로그램 자체에서 처리할 수 없는 예상치 못한 프로그램 결과입니다.
프로그램을 수정하면 오류가 해결됩니다. 오류의 예로는 실행이 멈추지 않는 무한 루프가 있습니다.
예외란 프로그램 자체에서 처리할 수 있는 예상치 못한 프로그램 결과입니다.
예외 발생 사례로는 존재하지 않는 파일을 열려고 시도하는 경우가 있습니다.
이 예외는 파일을 생성하거나 사용자에게 파일 검색 옵션을 제공하여 처리할 수 있습니다.
예외 처리를 해야 하는 이유는 무엇일까요?
- 저희 페이지에서 예상치 못한 결과가 발생하는 것을 방지하세요. 이는 최종 사용자에게 매우 불편하거나 불쾌감을 줄 수 있습니다.
- 악의적인 사용자가 당사 애플리케이션을 공격하는 데 사용할 수 있는 정보를 노출하지 않음으로써 당사 애플리케이션의 보안을 향상시킵니다.
- PHP 예외 처리는 예측 가능한 오류가 발생할 경우 프로그램의 정상적인 흐름을 변경하는 데 사용됩니다.
PHP 오류 처리
오류가 발생하면 구성 설정에 따라 PHP 발생한 오류와 관련된 정보와 함께 웹 브라우저에 오류 메시지를 표시합니다.
PHP는 오류를 처리하는 여러 가지 방법을 제공합니다. 우리는 일반적으로 사용되는 세 가지 방법을 살펴볼 것입니다.
- 다이 스테이트먼트 - `die` 함수는 `echo` 함수와 `exit` 함수를 하나로 결합한 함수입니다. 오류 발생 시 메시지를 출력하고 스크립트 실행을 중지하려는 경우에 매우 유용합니다.
- 사용자 정의 오류 핸들러 – 오류가 발생할 때마다 호출되는 사용자 정의 함수입니다.
- PHP 오류 보고 – 오류 메시지는 PHP 오류 보고 설정에 따라 다릅니다. 이 방법은 오류 원인을 알 수 없는 개발 환경에서 매우 유용합니다. 표시되는 정보는 애플리케이션 디버깅에 도움이 될 수 있습니다.
오류 처리 예시
이제 오류 처리 루틴을 사용한 몇 가지 간단한 예제를 살펴보겠습니다.
0으로 나누는 계산이 있을 수 있다고 가정해 보겠습니다. PHP가 오류 메시지를 그대로 표시하는 대신, 이 경우를 깔끔하게 처리하고 싶습니다.
아래 코드는 위의 예를 구현합니다.
<?php
$denominator = 0;
echo 2 / $denominator;
?>
simple_error.php 파일을 phptuts 폴더에 저장했다고 가정하고, 해당 파일을 엽니다. URL http://localhost/phptuts/simple_error.php
다음과 같은 결과가 나타납니다.
위의 결과에서 볼 수 있듯이, 이는 우리 애플리케이션을 비전문적으로 보이게 만들고 사용자를 짜증나게 할 수 있습니다.
위 코드를 수정하여 애플리케이션에 대한 오류 처리기를 작성하겠습니다.
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
위 코드를 error_handling.php라는 이름으로 저장했다고 가정하고, 해당 파일을 엽니다. URL http://localhost/phptuts/error_handling.php
참고 : "파일을 찾을 수 없습니다"와 같은 단순 메시지를 표시하는 대신 위와 같은 메시지를 표시하는 것이 보안 측면에서 좋습니다.
사용자 지정 오류 처리기를 사용하는 또 다른 예제를 살펴보겠습니다.
사용자 정의 오류 처리기는 기본 PHP 오류 처리 기능으로 설정되며 기본적으로 오류 번호와 메시지를 표시합니다.
아래 코드는 위 예제의 구현을 보여줍니다.
<?php function my_error_handler($error_no, $error_msg) { echo "Oops, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
열기 URL http://localhost/phptuts/custom_error_handler.php다음과 같은 결과를 얻게 됩니다.
위 예시에서 볼 수 있듯이, 사용자 지정 오류 처리기는 다음과 같은 점에서 강력합니다.
- 이를 통해 오류 메시지를 사용자 정의할 수 있습니다.
- 사용자 지정 오류 처리기는 파일이나 데이터베이스에 오류를 기록하거나, 개발자에게 이메일을 보내는 등의 작업을 포함할 수 있습니다.
이제 세 번째 유형의 오류 처리를 살펴보겠습니다. PHP 내장 함수인 `error_reporting`을 사용할 것입니다. 이 함수의 기본 구문은 다음과 같습니다.
<?php error_reporting($reporting_level); ?>
이리,
- "error_reporting"은 PHP 오류 보고 기능입니다.
- "$reporting_level"은 선택 사항이며 보고 수준을 설정하는 데 사용할 수 있습니다. 보고 수준이 지정되지 않은 경우 PHP는 php.ini 파일에 지정된 기본 오류 보고 수준을 사용합니다.
| 보고 수준 | 기술설명 | 예시 |
|---|---|---|
| E_경고 | 경고 메시지만 표시합니다. 스크립트 실행을 중단하지 않습니다. | error_reporting(E_WARNING); |
| E_NOTICE | 프로그램이 정상적으로 실행되는 동안 발생할 수 있는 알림이나 오류가 발생할 수 있는 알림을 표시합니다. | 오류 보고(E_NOTICE); |
| E_USER_ERROR | 사용자가 생성한 오류, 즉 사용자 지정 오류 처리기를 표시합니다. | 오류 보고(E_USER_ERROR); |
| E_USER_WARNING | 사용자가 생성한 경고 메시지를 표시합니다. | error_reporting(E_USER_WARNING); |
| E_USER_NOTICE | 사용자가 생성한 알림을 표시합니다. | error_reporting(E_USER_NOTICE); |
| E_RECOVERABLE_ERROR | 치명적이지 않고 사용자 지정 오류 처리기를 사용하여 처리할 수 있는 오류를 표시합니다. | error_reporting(E_RECOVERABLE_ERROR); |
| E_ALL | 모든 오류 및 경고를 표시합니다. | 오류 보고(E_ALL); |
오류와 예외의 차이점
- 예외는 발생하며 포착되어야 하는 반면, 오류는 일반적으로 복구할 수 없습니다.
- 예외는 객체 지향적인 방식으로 처리됩니다. 즉, 예외가 발생하면 예외에 대한 세부 정보를 담고 있는 예외 객체가 생성됩니다.
아래 표는 예외 객체의 메서드를 보여줍니다.
| 방법 | 기술설명 | 예시 |
|---|---|---|
| getMessage () | 예외 메시지를 표시합니다. |
<?php
echo $e->getMessage();
?>
|
| 얻을Code() | 예외를 나타내는 숫자 코드를 표시합니다. |
<?php
echo $e->getCode();
?>
|
| 파일 가져오기() | 예외가 발생한 파일 이름과 경로를 표시합니다. |
<?php
echo $e->getFile();
?>
|
| getLine() | 예외가 발생한 줄 번호를 표시합니다. |
<?php
echo $e->getLine();
?>
|
| 얻을Trac이자형() | 뒷면의 배열을 표시합니다.trac예외 전 e |
<?php print_r( $e->getTrace()); ?> |
| 이전 get() | 현재 예외 이전에 이전 예외를 표시합니다. |
<?php
echo $e->getPrevious();
?>
|
| 얻을TraceAsString() | 뒷면을 표시합니다trac예외의 e를 배열 대신 문자열로 표시합니다. |
<?php
echo $e->getTraceAsString();
?>
|
| __toString() | 전체 예외를 문자열로 표시합니다. |
<?php
echo $e->__toString();
?>
|
예외를 발생시키기 위한 기본 구문은 다음과 같습니다.
<?php throw new Exception("This is an exception example"); ?>
이리,
- "throw"는 예외를 발생시키는 데 사용되는 키워드입니다.
- “new Exception(…)”은 예외 객체를 생성하고 “This is an exception example” 문자열을 메시지 매개변수로 전달합니다.
위 코드는 다음과 같은 메시지를 출력합니다.
이제 예외를 throw하고 catch하는 예제를 살펴보겠습니다. 위의 예제를 수정하여 try, throw, catch를 포함시키겠습니다.
기본 구문은 다음과 같습니다.
<?php try { // code goes here that could potentially throw an exception } catch (Exception $e) { // exception handling code goes here } ?>
이리,
- "try{...}"는 잠재적으로 예외가 발생할 수 있는 실행될 코드 블록입니다.
- "catch(Exception $e){...}"는 던져진 예외를 포착하고 예외 개체를 변수 $e에 할당하는 코드 블록입니다.
아래 코드는 try, throw, catch 구문을 사용하여 구현한 기본적인 예외 처리 예제입니다. 프로그램은 의도적으로 예외를 발생시킨 후 이를 catch합니다.
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
열기 URL http://localhost/phptuts/exception_handling.php다음과 같은 결과를 얻게 됩니다.
PHP의 try 문에서는 발생하는 예외 유형에 따라 여러 개의 예외를 생성할 수도 있습니다.
에 대한 기사를 참조하세요. MySQLPHP 데이터 접근을 통한 다중 예외 처리 구현 예시.
여러 예외
여러 예외를 처리하는 경우, 발생한 예외를 처리하기 위해 여러 개의 catch 블록을 사용합니다. 여러 예외를 처리하는 것은 다음과 같은 경우에 유용합니다.
- 발생한 예외에 따라 사용자 정의된 메시지를 표시하고 싶습니다.
- 발생한 예외에 따라 고유한 작업을 수행하려고 합니다.
아래 순서도는 여러 예외가 발생하는 방식을 보여줍니다.
여러 예외를 사용하는 예제를 살펴보겠습니다. 전달된 분모로 숫자를 나누는 코드를 수정해 보겠습니다.
우리는 두 가지 유형의 예외가 발생할 것으로 예상합니다.
- XNUMX으로 나누기
- 음수로 나누기
간단하게 설명하기 위해 catch 블록에서는 예외 유형만 표시하겠습니다. PHP의 내장 클래스인 Exception은 예외를 발생시키는 데 사용됩니다. 우리는 Exception 클래스를 상속하는 두 개의 클래스를 생성하고 이를 사용하여 예외를 발생시킬 것입니다.
아래 코드는 구현을 보여줍니다.
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
코드 테스트
multiple_exceptions.php 파일을 phptuts 폴더에 저장했다고 가정하겠습니다.
찾아보기 URL http://localhost/phptuts/multiple_exceptions.php
PHP 파일로 돌아가서 다음 다이어그램과 같이 매개변수로 -1을 전달합니다.
찾아보기 URL http://localhost/phptuts/multiple_exceptions.php어떤 결과가 나오나요? 이제 매개변수로 3을 전달해 보세요. 어떤 결과가 나오나요?
finally 블록과 PHP 7 오류 모델
최신 PHP는 위 모델에 두 가지 중요한 요소를 추가합니다. finally 블록은 예외 발생 여부와 관계없이 try와 catch 블록 다음에 실행되므로 파일이나 데이터베이스 연결을 닫는 등의 정리 작업에 이상적입니다.
PHP 7 이후로 이전의 치명적인 오류들은 대부분 Error 객체로 처리됩니다. Exception과 Error는 모두 Throwable 인터페이스를 구현하므로, catch (\Throwable $e) 블록을 사용하여 둘 중 하나를 처리할 수 있습니다.
<?php try { $result = 10 / 0; } catch (DivisionByZeroError $e) { echo "Caught: " . $e->getMessage(); } finally { echo "This message always runs"; } ?>
여기서 0으로 나누면 PHP 8에서 DivisionByZeroError가 발생하며, catch 블록에서 이를 보고하고 finally 블록은 오류 발생 여부와 관계없이 항상 실행되어 메시지를 출력합니다.








