Apa yang perlu dilakukan jika pengecualian/ralat global berlaku dalam PHP

醉折花枝作酒筹
Lepaskan: 2023-02-18 07:34:01
ke hadapan
2278 orang telah melayarinya

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.

Apa yang perlu dilakukan jika pengecualian/ralat global berlaku dalam PHP

Exception

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'
Salin selepas log masuk

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;
Salin selepas log masuk

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

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 diproses
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!";
Salin selepas log masuk

Petua:
<?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);
Salin selepas log masuk

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 php

Atas 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!

Label berkaitan:
php
sumber:csdn.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!