PHP Try Catch 예제: 예외 및 오류 처리 튜토리얼

⚡ 스마트 요약

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

  • ⚠️ 오류와 예외: 오류는 일반적으로 복구할 수 없는 반면, 예외는 프로그램이 포착하고 처리할 수 있는 예상치 못한 결과입니다.
  • 🛡️ 핸들링 이유: 오류를 처리하면 보기 흉한 출력물을 방지하고 사용자를 보호하며 공격자가 악용할 수 있는 세부 정보 유출을 막을 수 있습니다.
  • 🛑 다이 설명: `die` 함수는 메시지를 출력하고 스크립트 실행을 중지시켜, 오류가 발생했을 때 빠르게 실행을 중단하는 데 사용됩니다.
  • 🛠️ 사용자 정의 핸들러: set_error_handler() 함수는 오류를 사용자가 지정한 함수로 전달하여 로그를 남기거나 이메일을 보내거나 원하는 형식으로 메시지를 표시할 수 있도록 합니다.
  • 📢 오류보고 : `error_reporting()` 및 `E_ALL`과 같은 레벨은 PHP가 표시하는 경고 및 알림을 제어하며, 개발 중에 유용합니다.
  • 🧲 시도하고, 던지고, 받아보세요: try 블록은 위험한 코드를 실행하고, throw는 예외를 발생시키며, catch는 예외 객체의 메서드를 사용하여 예외를 처리합니다.
  • 🤖 AI 지원: AI 도구는 기존 코드에 try-catch 구문 처리를 추가하고 복잡한 스택 트레이스를 설명할 수 있습니다. trac오류 메시지입니다.

PHP 오류 처리 및 예외 처리

예외란 무엇입니까?

오류는 프로그램 자체에서 처리할 수 없는 예상치 못한 프로그램 결과입니다.

프로그램을 수정하면 오류가 해결됩니다. 오류의 예로는 실행이 멈추지 않는 무한 루프가 있습니다.

예외란 프로그램 자체에서 처리할 수 있는 예상치 못한 프로그램 결과입니다.

예외 발생 사례로는 존재하지 않는 파일을 열려고 시도하는 경우가 있습니다.

이 예외는 파일을 생성하거나 사용자에게 파일 검색 옵션을 제공하여 처리할 수 있습니다.

예외 처리를 해야 하는 이유는 무엇일까요?

  • 저희 페이지에서 예상치 못한 결과가 발생하는 것을 방지하세요. 이는 최종 사용자에게 매우 불편하거나 불쾌감을 줄 수 있습니다.
  • 악의적인 사용자가 당사 애플리케이션을 공격하는 데 사용할 수 있는 정보를 노출하지 않음으로써 당사 애플리케이션의 보안을 향상시킵니다.
  • PHP 예외 처리는 예측 가능한 오류가 발생할 경우 프로그램의 정상적인 흐름을 변경하는 데 사용됩니다.

PHP 오류 처리

오류가 발생하면 구성 설정에 따라 PHP 발생한 오류와 관련된 정보와 함께 웹 브라우저에 오류 메시지를 표시합니다.

PHP는 오류를 처리하는 여러 가지 방법을 제공합니다. 우리는 일반적으로 사용되는 세 가지 방법을 살펴볼 것입니다.

  1. 다이 스테이트먼트 - `die` 함수는 `echo` 함수와 `exit` 함수를 하나로 결합한 함수입니다. 오류 발생 시 메시지를 출력하고 스크립트 실행을 중지하려는 경우에 매우 유용합니다.
  2. 사용자 정의 오류 핸들러 – 오류가 발생할 때마다 호출되는 사용자 정의 함수입니다.
  3. PHP 오류 보고 – 오류 메시지는 PHP 오류 보고 설정에 따라 다릅니다. 이 방법은 오류 원인을 알 수 없는 개발 환경에서 매우 유용합니다. 표시되는 정보는 애플리케이션 디버깅에 도움이 될 수 있습니다.

오류 처리 예시

이제 오류 처리 루틴을 사용한 몇 가지 간단한 예제를 살펴보겠습니다.

0으로 나누는 계산이 있을 수 있다고 가정해 보겠습니다. PHP가 오류 메시지를 그대로 표시하는 대신, 이 경우를 깔끔하게 처리하고 싶습니다.

아래 코드는 위의 예를 구현합니다.

<?php
$denominator = 0;
echo 2 / $denominator;
?>

simple_error.php 파일을 phptuts 폴더에 저장했다고 가정하고, 해당 파일을 엽니다. URL http://localhost/phptuts/simple_error.php

다음과 같은 결과가 나타납니다.

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 예외 핸들

참고 : "파일을 찾을 수 없습니다"와 같은 단순 메시지를 표시하는 대신 위와 같은 메시지를 표시하는 것이 보안 측면에서 좋습니다.

사용자 지정 오류 처리기를 사용하는 또 다른 예제를 살펴보겠습니다.

사용자 정의 오류 처리기는 기본 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 오류 처리

위 예시에서 볼 수 있듯이, 사용자 지정 오류 처리기는 다음과 같은 점에서 강력합니다.

  • 이를 통해 오류 메시지를 사용자 정의할 수 있습니다.
  • 사용자 지정 오류 처리기는 파일이나 데이터베이스에 오류를 기록하거나, 개발자에게 이메일을 보내는 등의 작업을 포함할 수 있습니다.

이제 세 번째 유형의 오류 처리를 살펴보겠습니다. 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” 문자열을 메시지 매개변수로 전달합니다.

위 코드는 다음과 같은 메시지를 출력합니다.

PHP의 PHP 예외 핸들

이제 예외를 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의 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의 PHP 예외 핸들

PHP 파일로 돌아가서 다음 다이어그램과 같이 매개변수로 -1을 전달합니다.

PHP의 PHP 예외 핸들

찾아보기 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 블록은 오류 발생 여부와 관계없이 항상 실행되어 메시지를 출력합니다.

자주 묻는 질문

실제 운영 환경에서는 php.ini 파일에서 display_errors를 Off로, log_errors를 On으로 설정하고 error_log를 파일로 지정하세요. 또한, 방문자에게 노출하지 않고 사용자 지정 오류를 기록하려면 error_log('message')를 호출할 수도 있습니다.

try-catch는 throw 키워드로 발생한 예외를 처리합니다. set_error_handler는 기존 PHP 오류 및 경고를 가로챕니다. PHP 7 이상에서는 기존의 많은 오류가 catch할 수 있는 Error 객체로 발생합니다.

처리되지 않은 예외는 치명적인 오류가 되어 스크립트 실행을 중단하고 스택 트레이스와 함께 "처리되지 않은 예외" 메시지를 출력합니다. trace. set_exception_handler로 설정된 전역 핸들러는 최후의 수단으로 이러한 예외를 처리할 수 있습니다.

네. AI는 위험한 작업을 try-catch 블록으로 감싸고, 적절한 예외 유형을 선택하고, 정리 작업을 위한 finally 블록을 추가하고, 오류를 로그에 기록할 수 있습니다. Rev확인해야 할 예외 사항을 무시하지 않는다는 것을 확인하십시오.

네. 메시지를 붙여넣으세요. trac예를 들어, AI는 오류가 발생한 줄, 그 오류로 이어진 호출 체인, 그리고 가능한 원인을 파악한 다음, null 검사나 수정된 ​​인수와 같은 해결책을 제시할 수 있습니다.

이 게시물을 요약하면 다음과 같습니다.