>  기사  >  백엔드 개발  >  PHP에서 오류 처리 및 예외 처리 메커니즘을 해결하는 방법

PHP에서 오류 처리 및 예외 처리 메커니즘을 해결하는 방법

零到壹度
零到壹度원래의
2018-04-10 17:15:294919검색

이 글은 PHP에서 오류 처리 및 예외 처리 메커니즘을 해결하는 방법을 공유합니다. 여기에는 특정 참조 값이 있습니다. 도움이 필요한 친구는 이를 참조할 수 있습니다.

PHP 프로그램을 작성할 때 오류 처리는 중요한 부분입니다. 프로그램에 오류 감지 코드가 없으면 매우 비전문적으로 보이고 보안 위험에 노출됩니다

예:

<?php
    $a = fopen(&#39;test.txt&#39;,&#39;r&#39;);
    //这里并没有对文件进行判断就打开了,如果文件不存在就会报错
?>

그럼 올바른 쓰기는 다음과 같아야 합니다.

<?php
    if (file_exists(&#39;test.txt&#39;)) {
        $f = fopen(&#39;test.txt&#39;, &#39;r&#39;);
        // 使用完后关闭
        fclose($f);
    }
?>

1. 세 가지 방법 PHP 오류 처리

A. 간단한 die() 문은

와 동일합니다. 1. 오류 처리기(일반적으로 구문 오류 처리에 사용되는 사용자 정의 오류)

사용자 정의 오류 함수 만들기 (핸들러) 함수는 최소 2개의 매개변수(error_level 및 errormessage)를 처리할 수 있어야 하지만 최대 5개의 매개변수(error_file, error_line, error_context)를 허용할 수 있습니다.

구문: ​​

if (!file_exists(&#39;aa.txt&#39;)) {
    die(&#39;文件不存在&#39;);
} else {
    // 执行操作
}
// 如果上面die()被触发,那么这里echo接不被执行
echo &#39;ok&#39;;

오류 보고 수준(그냥 이해하세요) 이러한 오류 보고 수준은 오류 처리기가 처리하도록 설계된 다양한 오류 유형입니다.

file_exits(&#39;aaa.txt&#39;) or die(&#39;文件不存在&#39;);
echo &#39;ok&#39;;

2. 오류 트리거(일반적으로 논리적 오류를 처리하는 데 사용됨)

요구 사항: 예를 들어, 연령을 수신하려는 경우 숫자가 120보다 크면 오류로 간주됩니다.

전통적인 방법:

function error_function($error_level, $error_message, $error_file, $error_line, $error_context)
// 创建好后还需要改写set_error_handler();函数
set_error_handler(&#39;error_function&#39;, E_WARNING); // 这里error_function对应上面创建的自定义处理器名,第二个参数为使用自定义错误处理器的错误级别;

트리거 사용:

值        常量                                  描述
2    E_WARNING    非致命的 run-time 错误。不暂停脚本执行。    
8    E_NOTICE    Run-time 通知。脚本发现可能有错误发生,但也可能在脚本正常运行时发生。    
256    E_USER_ERROR    致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。    
512    E_USER_WARNING    非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。    
1024    E_USER_NOTICE    用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。    
4096    E_RECOVERABLE_ERROR    可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())    
8191    E_ALL    所有错误和警告,除级别 E_STRICT 以外。(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)

연습 질문:

<?php
if ($age > 120) {
    echo &#39;年龄错误&#39;;
    exit();
}
?>

C. 오류 로그

기본적으로, PHP의 error_log 구성에 따라 .ini, PHP는 오류 기록을 서버의 오류 기록 시스템이나 파일로 보냅니다. error_log() 함수를 사용하여 오류 레코드를 파일이나 원격 대상으로 보낼 수 있습니다.

구문: ​​

<?php
if ($age > 120) {
    // trigger_error(&#39;错误信息&#39;[,&#39;错误等级&#39;]); 这里错误等级为可选项,用于定义该错误的级别
    // 用户定义的级别包含以下三种:E_USER_WARNING 、E_USER_ERROR 、E_USER_NOTICE
    trigger_error(&#39;年龄错误&#39;); // 这里是调用的系统默认的错误处理方式,我们也可以用自定义处理器
}
 
/**
 * 自定义处理器,与上面相同
 */
function myerror($error_level, $error_message) {
    echo &#39;error text&#39;;
}
 
//  同时需要改变系统默认的处理函数
set_error_handler(&#39;myerror&#39;, E_USER_WARNING); // 同上面,第一个参数为自定义函数的名称,第二个为错误级别【这里的错误级别通常为以下三种:E_USER_WARNING 、E_USER_ERROR 、E_USER_NOTICE】
// 现在再使用trigger_error就可以使用自定义的错误处理函数了
?>

유형 부분은 일반적으로 3입니다. 이는 원본 콘텐츠 대상을 덮어쓰지 않고 파일 뒤에 오류 정보를 추가하는 것을 의미합니다. 이는 저장된 파일 또는 원격 대상

예: error_log("$error_info",3,"errors.txt");2. PHP 예외 처리 [핵심 사항]

1. 기본 구문

<?php
date_default_timezone_set(&#39;PRC&#39;);
function myerror($error_level, $error_message) {
    $info = "错误号:$error_level";
    $info .= "错误信息:$error_message";
    $info .= &#39;发生时间:&#39; . date(&#39;Y-m-d H:i:s&#39;);
    $filename = &#39;aa.txt&#39;;
    if (!$fp = fopen($filename, &#39;a&#39;)) {
        echo &#39;创建文件&#39; . $filename . &#39;失败&#39;;
    }
    if (is_writeable($filename)) {
        if (!fwrite($fp, $info)) {
            echo &#39;写入文件失败&#39;;
        } else {
            echo &#39;已成功记录错误信息&#39;;
        }
        fclose($fp);
    } else {
        echo &#39;文件&#39; . $filename . &#39;不可写&#39;;
    }
    exit();
}
 
set_error_handler(&#39;myerror&#39;, E_WARNING);
$fp = fopen(&#39;aaa.txt&#39;, &#39;r&#39;);
?>

2. 처리 프로그램에는 다음이 포함되어야 합니다.

try - 예외를 사용하는 함수는 "try" 코드 블록 내에 위치해야 합니다. 예외가 트리거되지 않으면 코드는 평소대로 계속 실행됩니다. 그러나 예외가 트리거되면 예외가 발생합니다.

throw - 예외를 트리거하는 방법을 지정합니다. 각 "throw"는 최소한 하나의 "catch"에 해당해야 합니다.

catch - "catch" 코드 블록은 예외를 포착하고 예외 정보가 포함된 객체를 생성합니다.

890697ac255b423751e90bc72a0c9693getMessage()를 호출하여 이 예외로 인한 오류 메시지를 출력합니다.

그러나 "각 투구는 캐치와 일치해야 한다"는 원칙을 따르기 위해 누락된 오류를 처리하도록 최상위 예외 핸들러를 설정할 수 있습니다.

set_Exception_handler() 함수는 포착되지 않은 모든 예외를 처리하는 사용자 정의 함수를 설정할 수 있습니다.

<?php
try {
    // 可能出现错误或异常的代码
    //catch 捕获  Exception是PHP已定义好的异常类
} catch (Exception $e) {
    // 对异常处理,方法:
    //1、自己处理
    //2、不处理,可以再次抛出 throw new Exception(&#39;xxx&#39;);
}
?>

사용자 정의 예외 클래스 만들기

?php
/**
 * 创建可抛出一个异常的函数
 */
function checkNum($number) {
    if ($number > 1) {
        throw new Exception("Value must be 1 or below");
    }
 
    return true;
}
 
// 在 "try" 代码块中触发异常
try {
    checkNum(2);
    // 如果异常被抛出,那么下面一行代码将不会被输出
    echo &#39;If you see this, the number is 1 or below&#39;;
} catch (Exception $e) {
    // 捕获异常
    echo &#39;Message: &#39; . $e->getMessage();
}
?>

다양한 상황에서 오류 메시지를 반환하기 위해 여러 catch를 사용할 수 있습니다.

<?php
/**
 * 设置一个顶级异常处理器
 */
function myexception($e) {
    echo &#39;this is top exception&#39;;
}
 
// 修改默认的异常处理器
set_exception_handler("myexception");
try {
    $i = 5;
    if ($i < 10) {
        throw new Exception(&#39;$i must greater than 10&#39;);
    }
} catch (Exception $e) {
    // 处理异常
    echo $e->getMessage() . &#39;<br/>&#39;;
 
    // 不处理异常,继续抛出
    throw new Exception(&#39;errorinfo&#39;); // 也可以用throw $e 保留原错误信息;
}
?>

예외 규칙

예외 처리가 필요한 코드는 캡처를 용이하게 하기 위해 try 코드 블록에 배치되어야 합니다. 잠재적인 이상 현상.

각 try 또는 throw 코드 블록에는 해당하는 catch 코드 블록이 하나 이상 있어야 합니다.

다양한 예외를 포착하려면 여러 개의 catch 블록을 사용하세요.

try 코드 내의 catch 블록에서 예외가 다시 발생할 수 있습니다.

간단히 말하자면, 예외가 발생하면 이를 잡아야 합니다.

위 내용은 PHP에서 오류 처리 및 예외 처리 메커니즘을 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.