PHP错误、异常汇总
Error
Error级别
Fatal Error:致命错误(脚本终止运行)
E_ERROR 致命的运行时的致命错误,终止程序执行
E_CORE_ERROR PHP 启动时的致命错误
E_COMPILE_ERROR PHP编译时的致命错误
E_USER_ERROR 用户产生的致命错误
Parse Error:编译时的解析错误(脚本终止运行)
Parse Error 编译时的语法解析错误
Warning Error:警告错误(仅给出提示信息,但是脚本不会终止运行。)
E_WARNING 运行时警告 (非致命错误)。
E_CORE_WARNING PHP初始化启动过程中发生的警告 (非致命错误) 。
E_COMPILE_WARNING 编译警告
E_USER_WARNING 用户产生的警告信息
Notice Error:通知错误(仅给出通知信息,但是脚本不会终止运行。)
E_NOTICE 运行时通知。表示脚本遇到可能会表现为错误的情况.
E_USER_NOTICE 用户产生的通知信息。
set_error_handler()捕获错误【有局限】
函数说明
set_error_handler($callback);//设置一个用户的函数(error_handler)来处理脚本中出现的错误。
函数的局限性
以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。
也就是:set_error_handler($callback)只能捕获系统产生的一些Warning、Notice级别的Error。
使用方法
<?phpset_error_handler("error_handler");function error_handler($errno,$errstr,$errfile,$errline){ $str=<<<EOF "errno":$errno "errstr":$errstr "errfile":$errfile "errline":$errlineEOF; //获取到错误可以自己处理,比如记Log、报警等等 echo $str; }echo $test;//$test未定义,会报一个notice级别的错误
输出结果:
"errno":8"errstr":Undefined variable: test"errfile":/Users/shuchao/Desktop/handler.php"errline":13 如何捕获PHP的Fatal Error、Parse Error等
需求描述
获取PHP的fatal error,比如记录到Log里面,利于我们分析线上问题,可以做线上服务的监控。
两个函数
register_shutdown_function()
register_shutdown_function($callback)
register_shutdown_function(),就把你要注册进去的function放进【假装是队列吧】,等到脚本正常退出或显示调用exit时,再把注册进去的function拉出来执行.
register_shutdown_function()调用的3种情况:
脚本正常退出时;
在脚本运行(run-time not parse-time)出错退出时;
用户调用exit方法退出时。
error_get_last()
error_get_last();//函数获取最后发生的错误。
该函数以数组的形式返回最后发生的错误。
返回的数组包含 4 个键和值:
[type] - 错误类型
[message] - 错误消息
[file] - 发生错误所在的文件
[line] - 发生错误所在的行
使用方法
<?php register_shutdown_function( "fatal_handler" ); define('E_FATAL', E_ERROR | E_USER_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_RECOVERABLE_ERROR| E_PARSE );function fatal_handler() { if( $error = error_get_last()) { $errno = $error["type"]; $errfile = $error["file"]; $errline = $error["line"]; $errstr = $error["message"]; $str=<<<EOF "errno":$errno "errstr":$errstr "errfile":$errfile "errline":$errlineEOF; //获取到错误可以自己处理,比如记Log、报警等等 echo $str; } }
强烈注意
在parse-time出错的时候,是不会调用register_shutdown_function()函数的。只有在run-time出错的时候,才会调用register_shutdown_function()。
下面我们举例说明:
NO.1
error_handler.php
<?phpregister_shutdown_function("error_handler");function error_handler(){ echo "Yeah,it's worked!"; }function test(){}function test(){}
执行结果如下:
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/error_handler.php:6) in/Users/shuchao/Desktop/error_handler.php on line 7
原因分析
在执行error_handler.php的时候,由于重复定义了两个函数test(),在php的parse-time就出错了(不是run-time),所以不能回调register_shutdown_function()中的函数。
NO.2
error_handler.php
<?phpregister_shutdown_function("error_handler");function error_handler(){ echo "Yeah,it's worked!"; }if(true){ function test(){} }function test(){}
执行结果如下:
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/error_handler.php:9) in /Users/shuchao/Desktop/error_handler.php on line 7Yeah,it's worked!%
原因分析
我们看到,上面回调了register_shutdown_function().
因为我们加了一个if()判断,if()里面的test()方法,相当于一个闭包,与外面的test()名称不冲突。
也就是,上面的代码在parse-time没有出错,而是在run-time的时候出错了,所以我们能够获取到fatal error。
NO.3
error_handler.php
<?phpregister_shutdown_function("error_handler");function error_handler(){ echo "Yeah,it's worked!";} test_error.php <?phpinclude './error_handler.php';function test(){}function test(){}
执行 test_error.php的结果如下
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/test_error.php:3) in/Users/shuchao/Desktop/test_error.php on line 4
原因分析
当我们在运行test_error.php的时候,因为redeclare了两个test()方法,所以php的语法解析器在parse-time的时候就出错了。 所以不能回调register_shutdown_function()中的方法,不能catch住这个fatal error。
NO.4
error_handler.php <?phpregister_shutdown_function("error_handler");function error_handler(){ echo "Yeah,it's worked!";} test_error.php <?phpfunction test(){}function test(){} include_all.php require './error_handler.php';require './test_error.php';
执行 include_all.php的结果如下
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/include_all.php:2) in /Users/shuchao/Desktop/include_all.php on line 3Yeah,it's worked!%
结果分析
上面我们捕获了fatal_error.因为在运行include_all.php的时候,include_all.php本身语法并没有出错,也就是在parse-time的时候并没有出错,而是include的文件出错了,也就是在run-time的时候出错了,这个时候是能回调register_shutdown_function()中的函数的。
强烈建议:如果我们要使用register_shutdown_function进行错误捕捉,使用NO.4,最后一种方法,可以确保错误都能捕捉到。
更优美的写法·获取所有错误
set_error_handler()与register_shutdown_function()、error_get_last()的结合使用 <?phpregister_shutdown_function( "fatal_handler" );set_error_handler("error_handler");define('E_FATAL', E_ERROR | E_USER_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_RECOVERABLE_ERROR| E_PARSE );//获取fatal errorfunction fatal_handler() { $error = error_get_last(); if($error && ($error["type"]===($error["type"] & E_FATAL))) { $errno = $error["type"]; $errfile = $error["file"]; $errline = $error["line"]; $errstr = $error["message"]; error_handler($errno,$errstr,$errfile,$errline); }}//获取所有的errorfunction error_handler($errno,$errstr,$errfile,$errline){ $str=<<<EOF "errno":$errno "errstr":$errstr "errfile":$errfile "errline":$errlineEOF;//获取到错误可以自己处理,比如记Log、报警等等 echo $str;} Exception Exception与Error的区别 Exception
当异常抛出的时候,我们是想要去捕获他,并去做处理的。所以异常经常被当做程序的控制流程使用。
Error
Error是不可恢复的,是在开发过程中要去解决的。
使用Exception的例子
我想执行insert语句插入一条数据,可能插入失败(比如ID重复),注意是可能失败,所以这是一个可能的情况,也就是异常情况。我们就可以使用异常来处理这个问题
try { $row->insert(); $inserted = true; } catch (Exception $e) { echo "There was an error inserting the row - ".$e->getMessage(); $inserted = false; }echo "Some more stuff";
如何catch一个未捕获的Exception
场景描述
假设程序中的有些地方直接throw了异常,没有进行catch。我们现在想要不管在程序的任何一个地方throw异常,即便在throw的地方没有被catch,我们也要能catch住,如何做到呢?
一个函数:set_exception_handler()
//设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 exception_handler 调用后异常会中止。
set_exception_handler()
使用示例
1、exception_handler.php <?phpset_exception_handler("my_exception");function my_exception($exception){ echo $exception->getMessage();} 2、test_exception.php <?phprequire "./exception_handler.php";throw new Exception("I am Exception");
现在我们运行 test_exception.php,结果如下:
I am Exception //证明我们throw的Exception被捕获了

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas





PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.
