English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHP 基础教程

PHP 高级教程

PHP & MySQL

PHP 参考手册

PHP 예외 처리

在本教程中,您将学习如何在PHP中引发和捕获异常。

什么是异常

异常是表示发生某种异常事件或错误的信号。可能由于多种原因导致异常,例如,数据库连接或查询失败,您尝试访问的文件不存在等等。

PHP提供了强大的异常处理机制,使您能够以优雅的方式处理异常。与PHP的传统错误处理系统相反,异常处理是一种用于处理错误面向对象的方法,它提供了更具指定性和灵活性的错误报告形式。异常模型最早是在PHP 5中引入的。

使用Throw 和 Try ... Catch语句

在基于异常的方法中,程序代码编写在try块中,当在try块中执行代码期间发生异常事件时,可以使用throw语句引发异常。然后由一个或多个捕获块捕获并解析它。

下面的示例演示异常处理如何工作:

<?php
function division($dividend, $divisor){
    //如果除数为零,则抛出异常
    if($divisor == 0){
        throw new Exception('Division by zero.');
    } else{
        $quotient = $dividend / $divisor;
        echo "<p>$dividend / $divisor = $quotient</p>";
    }
}
 
try{
    division(10, 2);
    division(30, -4);
    division(15, 0);
    
    //如果抛出异常,后面的行将不会执行
    echo '<p>所有的均成功执行。<'/p>';
} catch(Exception $e){
    //예외 처리
    echo "<p>캡처된 예외: " . $e->getMessage() . "</p>";
}
 
// 실행 계속
echo "<p>Hello World!/p>";
?>

이 코드가 무엇에 대해 있는지 궁금해 할 수 있습니다. 아래로 보세요. 이 코드의 각 부분을 하나씩 살펴보면, 더 잘 이해할 수 있습니다.

코드 사용 설명

PHP의 예외 처리 시스템에는 네 가지 기본 부분이 있습니다: try, throw, catch 및 Exception 클래스. 다음 목록은 각 부분의 작동 방식을 설명합니다.

  • 이 예제의 division() 함수는 분수자가 0인지 확인합니다. 그렇다면 PHP의 throw 문장을 통해 예외를 던집니다. 그렇지 않으면 이 함수는 주어진 숫자로 분할하여 결과를 표시합니다.

  • 그런 다음, try 블록에서 다른 매개변수로 division() 함수를 호출합니다. try 블록에서 코드를 실행할 때 예외가 발생하면 PHP는 해당 점에서 실행을 중단하고相应的 catch 블록을 찾으려고 시도합니다. 만약 찾으면 catch 블록의 코드를 실행하고, 찾지 못하면 기본적인 오류를 발생시킵니다.

  • catch 블록은 일반적으로 try 블록에서 발생하는 예외를 잡고, 예외 정보를 포함한 객체($e)를 생성합니다. 이 객체에서.getMessage() 메서드를 사용하여 오류 메시지를 검색할 수 있습니다.

PHP의 예외 클래스는 getCode(),getFile(),getLine() 및 getTraceAsString() 메서드를 제공하여 상세한 디버깅 정보를 생성할 수 있습니다.

<?php
//默认错误报告关闭
error_reporting(0);
 
try{
    $file = "somefile.txt";
    
    //文件尝试打开
    $handle = fopen($file, "r");
    if(!$handle){
        throw new Exception("无法打开文件!", 5);
    }
    
    //文件内容尝试读取
    $content = fread($handle, filesize($file));
    if(!$content){
        throw new Exception("Could not read file!", 10);
    }
    
    //文件句柄关闭
    fclose($handle);
    
    //文件内容显示
    echo $content;
} catch(Exception $e){
    echo "<h3>Caught Exception!/h3>";
    echo "<p>Error message: " . $e->getMessage() . "</p>";    
    echo "<p>File: " . $e->getFile() . "</p>";
    echo "<p>Line: " . $e->getLine() . "</p>";
    echo "<p>Error code: " . $e->getCode() . "</p>";
    echo "<p>Trace: " . $e->getTraceAsString() . "</p>";
}
?>

예외 생성자는 예외 메시지와 예외 코드를 선택적으로 받을 수 있습니다. 예외 메시지는 일반적으로 오류 원인을 보여주는 일반 정보로 사용되지만, 예외 코드는 오류를 분류하는 데 사용될 수 있습니다. 제공된 예외 코드는 후에 Exception의 getCode() 메서드를 통해 검색할 수 있습니다.

추천:예외는 특정한 특별한 상황에만 적용되어야 합니다. 예를 들어, 스크립트 내 특정 위치로 이동하는 일반应用程序流程에 사용되지 않아야 합니다. 이렇게 하면应用程序의 성능에 부정적인 영향을 미칠 수 있습니다.

사용자 정의 예외 정의

사용자 정의 예외 처리기를 정의하여 다른 방식으로 다양한 예외를 처리할 수 있습니다. 이는 각 예외 타입에 대해 별도의 catch 블록을 사용할 수 있게 합니다.
Exception 클래스를 확장하여 사용자 정의 예외를 정의할 수 있습니다. Exception은 모든 예외의 기본 클래스이며, 사용자 정의 예외 클래스는 PHP Exception 클래스의 모든 속성과 메서드를 상속합니다. 또한 사용자 정의 메서드를 사용자 정의 예외 클래스에 추가할 수 있습니다. 다음 예제를 보겠습니다:

<?php
//Exception 클래스를 확장합니다
class EmptyEmailException extends Exception {}
class InvalidEmailException extends Exception {}
 
$email = "[email protected]";
 
try{
    //이메일이 비어 있으면 예외를 투げ 던집니다
    if($email == ""){
        throw new EmptyEmailException("<p>이메일 주소를 입력하세요!</p>
    }
    
    //이메일이 유효하지 않으면 예외를 투げ 던집니다
    if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {           
        throw new InvalidEmailException("<p><b>$email</b> 이메일 주소가 유효하지 않습니다!/p>
    }
    
    // 이메일이 유효하면 성공 메시지를 표시합니다
    echo "<p>성공: 이메일��확인 성공.</p>";
catch(EmptyEmailException $e){
    echo $e->getMessage();
catch(InvalidEmailException $e){
    echo $e->getMessage();
}
?>

위의 예제에서, 우리는 Exception 기본 클래스에서 두 개의 새로운 예외 클래스를 파생시켰습니다:EmptyEmailExceptionInvalidEmailException여러 catch 블록을 사용하여 다른 오류 메시지를 표시하며, 생성된 예외 유형에 따라 다릅니다.

이러한 사용자 정의 예외 클래스는 Exception 클래스의 속성과 메서드를 상속하기 때문에, getMessage(), getLine(), getFile()와 같은 예외의 클래스 메서드를 사용하여 예외 객체의 오류 정보를 검색할 수 있습니다.

전체 예외 처리기 설정

이 장에서 이전에 논의한 것처럼, 미취获된 예외가 발생하면 PHP는 "Uncaught Exception ..." 메시지를 포함한 중요한 오류를 생성합니다. 이 오류 메시지는 문제가 발생한 파일 이름과 행 번호와 같은 민감한 정보를 포함할 수 있습니다. 이러한 정보를 사용자에게 공개하지 않기를 원한다면, 사용자 정의 함수를 생성하고 set_exception_handler() 함수에 등록하여 모든 미취获된 예외를 처리할 수 있습니다.

<?php
function handleUncaughtException($e){
    //사용자에게 일반 오류 메시지 표시
    echo "아이야! 문제가 발생했습니다. 다시 시도해 주세요. 문제가 계속된다면, 우리와 연락해 주세요.";
    
    // 오류 문자열 구성
    $error = "Uncaught Exception: " . $message = date("Y-m-d H:i:s - ");
    $error .= $e->getMessage() . " in file " . $e->getFile() . " on line " . $e->getLine() . "\n";
    
    //파일에 오류의 자세한 정보를 기록
    error_log($error, 3, "var/log/exceptionLog.log");
}
 
//사용자 정의 예외 처리기 등록
set_exception_handler("handleUncaughtException");
 
// 예외 투척
throw new Exception("Testing Exception!");
?>

주의:미취获된 예외는 항상 스크립트가 종료되도록 합니다. 따라서 예외가 발생한 점에서 스크립트가 계속 실행되기를 원한다면, 각 try 블록에는 반드시 하나의 catch 블록이 필요합니다.