ホームページ  >  記事  >  バックエンド開発  >  PHPのエラーや例外の詳しい説明と関連知識

PHPのエラーや例外の詳しい説明と関連知識

青灯夜游
青灯夜游転載
2020-07-25 17:32:352342ブラウズ

PHPのエラーや例外の詳しい説明と関連知識

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; //エラー報告レベルを設定します

  • #display_errors = 1;

    //開発環境を開き、実稼働環境を閉じる

PHP 例外

##PHP 例外は新しく追加された機能です。JAVA/C# 例外とは異なり、PHP 例外は、自動的にスローされるのではなく、手動で
    throw new Exception
  • をスローする必要があります。システム

    PHP エラーと例外の違い、これらは 2 つの
  • 異なる概念
  • ですが、共通点があります。例外がキャッチされ処理されない場合、プログラムは終了し、致命的なエラーが報告されます。これを見ると、誰もが例外が一種のエラーであると考えるでしょう。これは幻想ですが、このように理解できます。ただし、プログラムは例外がキャッチされた後も実行を続けることができますが、実際の致命的エラーが発生した後にプログラムを終了する必要があります。

    例外は # を使用して処理できます。 ##try{}catch(){}
    を使用してキャプチャをキャプチャします。キャプチャ後、後続のコードは引き続き実行できますが、

    try{}catch(){}
    # を使用してエラーをキャプチャすることはできません。
  • # #例外がスローされた場合は、それをキャッチする必要があります。そうしないと、プログラムは実行を終了します。

    #PHP 例外とエラーのスロー
例外のスロー:

新しい例外をスローする('何らかのエラー メッセージ');

エラー スロー:
    trigger_error()
  • ## trigger_error()
  • トリガーされたエラーは

    try-catch 例外キャッチ ステートメントでは捕捉されません

  • #PHP エラー処理

  • ##set_error_handler()

Deprecated

    Notice## のみを処理できます#、
  • Waning

    これら 3 つのレベルのエラー。処理後、スクリプトはエラーの後の行を実行し続けます。

register_shutdown_function()

このメソッドはスクリプト終了前の最後のコールバック関数であるため、die()/error (例外)/スクリプトが正常に終了したかどうかに関係なく呼び出されます

    PHP 例外処理
set_Exception_handler()

デフォルトの例外ハンドラを設定します。try/catch キャプチャがある場合、この関数は実行されません。そうでない場合は実行されます。また、実行された場合、スクリプトは次のコード行の実行を継続しません。例外が発生した場所で、プログラムはただちに終了します。

  • set_Exception_handler()

    Notes

  • set_Exception_handler(“myException” )
関数名

を受け入れるだけでなく、

クラスメソッド
    も受け入れることができます(
  • パブリック静的メソッド

    およびパブリック非静的メソッドも受け入れ可能)ただし、

    配列形式
  • である必要があり、配列の最初の値は「
クラス名

」、2番目のパラメータは「メソッド名」です。次のコードに示すように:

<?php
class App{
    function myException($exception) {
        echo "<b>Exception:</b> " , $exception->getMessage();
    }
}
 
set_exception_handler(array(&#39;App&#39;,&#39;myException&#39;));
 
throw new Exception(&#39;Uncaught Exception occurred&#39;);
?>
PHP 例外分類ユーザーの動作によって発生する例外

1. バリデーターに合格しない

2、没查询到结果

3、需要向用户返回具体信息

4、不需要记录日志

5、可作为异常或者不作为异常,根据需求和个人情况而定

  • 由于服务器自身导致出现异常

    1、代码出错

    2、调用第三方接口错误

    3、不需要向用户返回具体信息

    4、需要记录日志

  • 在程序中PHP异常的自动抛出

    • 由于PHP异常是后面版本新增的特性,设计上与JAVA/C#的异常不一样,JAVA的异常大部分是系统自动抛出,而PHP异常不是系统自动抛出,需要手动抛出导致PHP异常在程序中的作用减半(异常就是意料之外的事情,根本我们意料不到的,如果用手动抛出,证明已经预先预料到了,那异常的意义就变味了)

    • 在PHP中异常是手动抛出的,而错误是系统自动抛出的(也可手动抛)

    • 我们需要把异常做成系统自动抛出接(例如JAVA)就必须借助错误(这三种错误DeprecatedNoticeWaning,其他的错误不行,因为会终止程序运行)

    <?php
    
        set_error_handler(&#39;error_handler&#39;);
    
        function error_handler($errno, $errstr, $errfile, $errline) {
            throw new Exception($errstr);
        }
    
        try {
            $num = 100 / 0;
        } catch(Exception $e) {
            echo $e -> getMessage() . &#39;<br/>&#39;;
        }
    
        echo "end";
    ?>

    执行结果:

    Division by zero
    end

    PHP7 异常处理的大变化

    • 一段TP5源代码引出PHP7异常的变化

      PHPのエラーや例外の詳しい説明と関連知識

      明明set_exception_handler()函数只可以捕获Exception类或派生类的对象,为何还需要捕获的对象做判断呢?结果引出了PHP7的变化,请看下面分析

    • 前面已经讲过异常是需要手动抛出,及时上面所说的方法最多也是把DeprecatedNoticeWaning这3类错误封装成系统自动抛出的异常,但致命错误仍然还是无法封装成系统自动抛出的异常,因为致命错误(Fatel Error)仍然无法捕获

    • 在PHP7之前,DeprecatedNoticeWaning这类错误是可以捕获的(使用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 サイトの他の関連記事を参照してください。

    声明:
    この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。