Semasa pembangunan, kami selalunya perlu menyesuaikan ralat dan fungsi pengendalian pengecualian untuk memberikan petua pemprosesan yang lebih mesra dalam senario yang berbeza. Hari ini kami akan memperkenalkan cara menggunakan set_exception_handler/set_error_handler untuk menyelesaikan pengecualian/ralat Anda boleh merujuknya jika perlu.
Jika kita membuang Exception tanpa try catch capture processing, sistem akan menjana ralat maut dan keluar dari pelaksanaan selepas membuang maklumat yang berkaitan. .
throw new Exception("Error Processing Request", 1); Fatal error: Uncaught exception 'Exception' with message 'Error Processing Request'
set_exception_handler boleh menetapkan fungsi pengendalian pengecualian global Apabila pengecualian tidak dikendalikan oleh try catch, sistem akan menyerahkan pengecualian kepada fungsi ini untuk diproses
<?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;
Nota. : Walau bagaimanapun Oleh kerana masih tiada pemprosesan tangkapan cuba untuk pengecualian, atur cara masih akan keluar dari pelaksanaan selepas pemprosesan, dan kod berikutnya tidak akan dilaksanakan.
Ralat yang sering kita hadapi dalam PHP ialah: ERROR/AMARAN/NOTIS
Kita boleh menggunakan fungsi trigger_error untuk mencetuskan ralat dan menggunakan set_error_handler untuk menentukan sendiri fungsi pengendalian ralat.
trigger_error mencetuskan ralat NOTIS peringkat pengguna secara lalai, yang tidak akan menjejaskan proses pelaksanaan Kod akan terus dilaksanakan Kami boleh menentukan sendiri tahap ralat apabila dicetuskan adalah untuk memintas ralat peringkat pengguna, ia tidak membenarkan skrip untuk keluar daripada pelaksanaan melainkan anda melaksanakan penilaian tahap ralat secara manual dalam kod pemprosesan anda sendiri. Jika pemintasan tidak dilakukan, ralat peringkat pengguna juga akan diserahkan kepada mekanisme pengendalian ralat sistem Mekanisme pengendalian ralat sistem adalah untuk keluar dengan ralat dan meneruskan pelaksanaan selepas notis amaran.
Selepas pengendalian ralat tersuai, ralat tidak lagi akan dihantar kepada sistem untuk diprosestrigger_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);
Pengecualian dibuang tetapi jangan gunakan cuba pemprosesan tangkapan. Sistem akan menjana ralat maut yang menyebabkan skrip keluar dari pelaksanaan set_exception_handler hanya menangkap pengecualian yang tidak dikendalikan oleh try catch dan menyesuaikan beberapa keluaran maklumat yang mesra Ia tidak dapat menghalang berlakunya ralat yang membawa maut perlaksanaan.
set_error_handler akan memintas ralat yang dicetuskan oleh pengguna untuk diproses dan bukannya menyerahkannya kepada sistem, tetapi ia tidak akan mengenal pasti tahap ralat secara automatik Kami perlu menentukan secara manual sama ada tahap RALAT untuk keluar atau AMARAN atau peringkat NOTIS menggesa untuk meneruskan pelaksanaan.
Pembelajaran yang disyorkan:
tutorial video phpAtas ialah kandungan terperinci Apa yang perlu dilakukan jika pengecualian/ralat global berlaku dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!