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

醉折花枝作酒筹
リリース: 2023-02-18 07:34:01
転載
2304 人が閲覧しました

開発中、さまざまなシナリオでよりわかりやすい処理のヒントを提供するために、エラーおよび例外処理関数をカスタマイズする必要があることがよくあります。今回は 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 サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート