PHP エラー レベル
解析エラー
> 致命的エラー
> Waning
> Notice
> 非推奨
非推奨 最低レベルのエラー (非推奨、提案ではありません) )これは、期限切れの関数を使用しているときに表示され、プログラムが引き続き実行されます
通知レベルのエラーを通知します未定義の関数を使用します変数、定数、または配列キーが引用符で囲まれていない場合に表示され、プログラムは引き続き実行されます。
#下降警告レベル エラー問題がありますコードを変更する必要があります。 ! !プログラムは実行を継続します
致命的エラー エラー レベルのエラープログラムはエラーを直接報告するため、コードを変更する必要があります。 ! !プログラムの実行を中断するには、 register_shutdown_function() 関数を使用して、プログラムが終了する前に関数をトリガーします。
解析エラー 構文解析エラーエラーは次のとおりです。構文チェック段階で報告されるため、コードを修正する必要があります。 ! !プログラムの実行を中断すると、ini ファイルを変更してエラー メッセージをログに書き込む以外に何もできなくなります
E_USER_関連エラーユーザー定義エラー、ユーザー手動でエラーをスローし、カスタマイズされたエラー処理を実行します
PHP エラー関連関数
ini_set('display_errors', 0);
//エラー出力をオフにする (開発環境はオン、実稼働環境はオフ)
error_reporting (E_ALL&~E_NOTICE);
//エラー報告レベルを設定します
ini_set('error_reporting',0);
//エラー報告レベルを設定します
PHP エラー設定
スクリプトでの設定に加えて、次のこともできます。 php.ini で設定します 設定ファイルで設定します
#error_reporting = E_ALL&~E_NOTICE; //エラー報告レベルを設定します
//開発環境を開き、実稼働環境を閉じる
PHP 例外
##PHP 例外は新しく追加された機能です。JAVA/C# 例外とは異なり、PHP 例外は、自動的にスローされるのではなく、手動で# を使用してエラーをキャプチャすることはできません。例外は # を使用して処理できます。 ##try{}catch(){}
try{}catch(){}
を使用してキャプチャをキャプチャします。キャプチャ後、後続のコードは引き続き実行できますが、
# #例外がスローされた場合は、それをキャッチする必要があります。そうしないと、プログラムは実行を終了します。
新しい例外をスローする('何らかのエラー メッセージ');
エラー スロー:try-catch 例外キャッチ ステートメントでは捕捉されません
#PHP エラー処理
は Deprecated
、 これら 3 つのレベルのエラー。処理後、スクリプトはエラーの後の行を実行し続けます。
このメソッドはスクリプト終了前の最後のコールバック関数であるため、die()/error (例外)/スクリプトが正常に終了したかどうかに関係なく呼び出されます
デフォルトの例外ハンドラを設定します。try/catch キャプチャがある場合、この関数は実行されません。そうでない場合は実行されます。また、実行された場合、スクリプトは次のコード行の実行を継続しません。例外が発生した場所で、プログラムはただちに終了します。
Notes
を受け入れるだけでなく、
クラスメソッドおよびパブリック非静的メソッド
も受け入れ可能)ただし、
」、2番目のパラメータは「メソッド名」です。次のコードに示すように: <?php
class App{
function myException($exception) {
echo "<b>Exception:</b> " , $exception->getMessage();
}
}
set_exception_handler(array('App','myException'));
throw new Exception('Uncaught Exception occurred');
?>
2、没查询到结果
3、需要向用户返回具体信息
4、不需要记录日志
5、可作为异常或者不作为异常,根据需求和个人情况而定
由于服务器自身导致出现异常
1、代码出错
2、调用第三方接口错误
3、不需要向用户返回具体信息
4、需要记录日志
在程序中PHP异常的自动抛出
由于PHP异常是后面版本新增的特性,设计上与JAVA/C#的异常不一样,JAVA的异常大部分是系统自动抛出,而PHP异常不是系统自动抛出
,需要手动抛出
,导致PHP异常在程序中的作用减半
(异常就是意料之外的事情,根本我们意料不到的,如果用手动抛出,证明已经预先预料到了,那异常的意义就变味了)
在PHP中异常是手动抛出的
,而错误是系统自动抛出的
(也可手动抛)
我们需要把异常做成系统自动抛出接
(例如JAVA)就必须借助错误
(这三种错误Deprecated
、Notice
、Waning
,其他的错误不行,因为会终止程序运行)
<?php set_error_handler('error_handler'); function error_handler($errno, $errstr, $errfile, $errline) { throw new Exception($errstr); } try { $num = 100 / 0; } catch(Exception $e) { echo $e -> getMessage() . '<br/>'; } echo "end"; ?>
执行结果:
Division by zero end
PHP7 异常处理的大变化
一段TP5源代码引出PHP7异常
的变化
明明set_exception_handler()函数只可以捕获Exception类或派生类的对象
,为何还需要捕获的对象做判断呢?结果引出了PHP7
的变化,请看下面分析
前面已经讲过异常是需要手动抛出
,及时上面所说的方法最多也是把Deprecated
、Notice
、Waning
这3类错误封装成系统自动抛出的异常,但致命错误仍然还是无法封装成系统自动抛出的异常,因为致命错误(Fatel Error)仍然无法捕获
在PHP7之前,Deprecated
、Notice
、Waning
这类错误是可以捕获的(使用set_error_handler()函数),而Fatel Error
无法捕获的
在PHP7之后,出现了一个异常与错误通用的接口Throwable,Exception类与Error类都实现了该接口,导致Error类或Error类的派生类的错误对象
(大部分Fatel Error,而之前三类错误不变)也可以像Exception一样被捕获(2种捕获方法:1、try/catch 2、set_exception_handler())
示例代码
try{ go();//该函数未定义 }catch(Exception $e){ //捕获异常 }catch(Error $er){ //捕获错误 }
相关教程推荐:《PHP教程》
以上がPHPのエラーや例外の詳しい説明と関連知識の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。