ホームページ  >  記事  >  バックエンド開発  >  PHP でグローバル例外/エラーが発生した場合の対処方法

PHP でグローバル例外/エラーが発生した場合の対処方法

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-07-26 09:28:302295ブラウズ

開発中、さまざまなシナリオでよりわかりやすい処理のヒントを提供するために、エラーおよび例外処理関数をカスタマイズする必要があることがよくあります。今回は set_Exception_handler/set_error_handler を使用して例外/エラーを解決する方法を紹介しますので、必要に応じて参照してください。

PHP でグローバル例外/エラーが発生した場合の対処方法

Exception

try catch キャプチャ処理を行わずに例外をスローすると、システムは致命的なエラーを生成し、関連情報をダンプした後に実行を終了します。 。

throw new Exception("Error Processing Request", 1);

Fatal error: Uncaught exception 'Exception' with message 'Error Processing Request'

set_Exception_handler はグローバル例外処理関数を設定できます。例外が try catch によって処理されない場合、システムは例外をこの関数に渡して処理します。

<?php
/**
 * 全局异常处理函数,会捕捉没有被 try catch 处理的异常
 * @param  [type] $exception [description]
 * @return [type]            [description]
 */
function func_exception_handler($exception)
{
    echo "User Exception:" .
        " [" . $exception->getCode() . "]" .
        " message " . $exception->getMessage() .
        " in file " . $exception->getFile() .
        " on line " . $exception->getLine() . PHP_EOL;
}

//如果不设定全局的异常处理函数 且 抛出异常时不使用 try catch 处理则会 fatal error
set_exception_handler("func_exception_handler");

try {
    throw new Exception("我会被 try catch 捕捉处理,不影响执行流程!");
} catch (Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}

throw new Exception("我没有被 try catch 捕捉处理,会被全局 set_exception_handler 处理!");

echo "没有被 try catch 处理的异常在我之前抛出,虽然被 set_exception_handler 但仍然会立刻退出执行,执行不到我哟" . PHP_EOL;

注: ただし、例外はまだありません try catch によって処理されますが、処理後もプログラムは実行を終了し、後続のコードは実行されません。

エラー

PHP でよく発生するエラーは次のとおりです: エラー/警告/通知

trigger_error 関数を使用してエラーをトリガーし、set_error_handler を使用して独自にエラーを定義できます。ハンドリング機能。

trigger_error のデフォルトはユーザーレベルの NOTICE エラーであり、実行プロセスには影響しません。コードは引き続き実行されます。トリガーされたときのエラー レベルは自分で定義できます。

注: set_error_handler はユーザーレベルのエラーをインターセプトするには、独自の処理コードにエラー レベルの判断を手動で実装しない限り、スクリプトの実行を終了することはできません。インターセプトが実行されない場合、ユーザー レベルのエラーもシステムのエラー処理メカニズムに引き渡されます。システムのエラー処理メカニズムは、エラーで終了し、警告通知後に実行を継続します。

trigger_error("notice, go on!", E_USER_NOTICE);

echo "executing!" . PHP_EOL;

trigger_error("warning, go on!", E_USER_WARNING);

echo "executing!" . PHP_EOL;

trigger_error("error, exit!", E_USER_ERROR);

echo "not execute!";

エラー処理をカスタマイズすると、エラーは処理のためにシステムに渡されなくなります。

<?php
/**
 * 用户自定义的错误处理
 * @param  [type] $err_no   错误级别
 * @param  [type] $err_msg  错误信息
 * @param  [type] $err_file 错误文件
 * @param  [type] $err_line 错误所在行
 * @return [type]           [description]
 */
function func_error_handler($err_no, $err_msg, $err_file, $err_line)
{
    //trigger_error 默认触发的为 notice 级别的用户错误
    $level = [
        E_USER_ERROR => "Error",
        E_USER_WARNING => "Waring",
        E_USER_NOTICE => "Notice"
    ];

    echo "User {$level[$err_no]}: " .
        " [" . $err_no . "]" .
        " message " . $err_msg .
        " in file " . $err_file .
        " on line " . $err_line . PHP_EOL;

    //如果需要 我们可以手动判断错误级别是否退出执行
    if ($err_no == E_USER_ERROR) {
        exit("fatal error, exit!");
    }
}

set_error_handler("func_error_handler");

trigger_error("notice, go on!", E_USER_NOTICE);

trigger_error("warning, go on!", E_USER_WARNING);

trigger_error("error, exit!", E_USER_ERROR);

ヒント:

例外がスローされたが try catch を使用しない場合処理中、システムは致命的なエラーを生成し、スクリプトの実行が終了します。set_Exception_handler は、try catch によって処理されない例外のみをキャプチャします。一部のわかりやすい情報出力をカスタマイズしても、致命的なエラーの発生は防止されません。スクリプトは引き続き実行を終了します。

set_error_handler は、ユーザーによってトリガーされたエラーをシステムに送信する代わりにインターセプトして処理しますが、エラー レベルは自動的には識別されません。終了するエラー レベルであるか、それともエラー レベルであるかを手動で判断する必要があります。 WARNING または NOTICE レベルでは、実行を続行するよう求められます。

推奨学習: php ビデオ チュートリアル

以上がPHP でグローバル例外/エラーが発生した場合の対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。