ホームページ  >  記事  >  バックエンド開発  >  PHP プログラマーが遭遇するエラーと例外 パート 1 エラー

PHP プログラマーが遭遇するエラーと例外 パート 1 エラー

不言
不言オリジナル
2018-04-09 15:44:412027ブラウズ

この記事では、PHP プログラマーが遭遇するエラーと例外を紹介します。必要な友達は参照してください

1. PHP のエラー モジュールの概要

PHP のエラーと例外は 2 つの異なる概念です。

1.1 エラーの種類

  1. セミコロンの欠落などの構文エラー

  2. 権限、ファイルを開けない、データベースサーバーが利用できないなどの環境エラー

  3. 論理エラー、例えば a= =b は次のように記述されますa=b

1.2 PHP 共通エラー レベル

  1. 非推奨最も低いレベルのエラー (非推奨は非推奨、通常の ereg( ) の古いバージョンなど) 関数は置き換えることができ、PHP の実行には影響しません)

    Depracated最低级别的错误 (deprecated不建议,不推荐,如老版本的正则ereg()函数换掉即可,并不影响PHP的执行)

  2. Notice通知级别的错误(语法不恰当导致的,不影响PHP的正常运行,如打印一个未定义的变量,所以我们一开始就要养成良好的书写规范)

  3. Warning警告级别的错误(必须修改代码)

  4. Fatal error致命级别的错误,程序会停止

  5. Parse error语法解析错误,在代码运行前检查,将无法执行代码

  6. E_USER_相关的错误 由用户定义的错误,手动抛出错误时会用到

1.3 如何设置错误级别

1.3.1 php.ini配置文件

error_reporting=E_ALL & ~E_NOTICE # 显示所有但不显示提醒错误
display_errors = Off|On # 是否显示错误,线上后关闭提高用户体验

1.3.2 动态设置

error_reporting() # 专业php错误处理设置函数,动态设置错误级别
error_reporting(0) # 不显示所有错误,但是解析parse语法错误会显示
error_reporting(-1) # 显示所有错误
Error_reporting(E_ALL|~E_WARING) # 除了警告错误以外的错误级别都报告

1.3.3 运行时设置配置选项的值

ini_set(option,value)

ini_set(error_reporting,0)
ini_set(error_reporting,-1)
ini_set(error_reporting,E_ALL)
ini_set(display_errors,0)
ini_set(display_errors,OFF/0)
error_reporting(-1);

14. trigger_error手动触发错发

    @错误抑制符,放在行首不显示该行错误

    手动抛出自定义错误信息:trigger_error('错误提示内容',E_USER_NOTICE)

    PHP プログラマーが遭遇するエラーと例外 パート 1 エラー

  错误级别:

E_USER_NOTICE # 继续执行(通知级别)
E_USER_WARNING # 继续执行(警告错误)
E_USER_ERROR # 程序不再执行(致命错误)

二、处理PHP中的错误

2.1 将错误日志保存在指定文件中

ini_set('display_errors','off') # 不显示错误给用户
ini_set("error_log","c:\error.log");       
error_reporting(-1); # 显示所有错误

2.2 错误日志保存在系统日志中

ini_set("error_log", 'syslog')

2.3 将错误日志发送到邮件

error_log("this is a errormsg",1,xxxxx@qq.com);

三、自定义错误处理器

3.1 set_error_handler自定义错误处理

set_error_handler("自定义函数名",'错误级别(选填)') # 设置一个用户定义的错误处理函数    

restore_error_handler(); # 回收(取消自定义错误函数接管php系统错误)

     PHP プログラマーが遭遇するエラーと例外 パート 1 エラー

3.2 自定义错误处理器

class MyErrorHandler{
    //错误信息
    public $message = '';
    //错误文件
    public $filename = '';
    //错误行号
    public $line = 0;
    //额外信息
    public $vars = array();
    protected $_noticelog = 'G:\notice\noticeLog.log';

    public function __construct($message, $filename, $line, $vars)
    {
        $this->message = $message;
        $this->filename = $filename;
        $this->line = $line;
        $this->vars = $vars;
    }
    //根据不同错误级别对应不同操作
    //遵循handler错误处理原则,errno:错误代码,line:错误行号
    public static function deal($errno,$errmsg,$filename,$line,$vars)
    {
        $self = new self($errmsg,$filename,$line,$vars);
        switch ($errno)
        {
            case E_USER_ERROR://致命级别
                return $self->dealError();
                break;
            case E_USER_WARNING://警告级别
            case E_WARNING:
                return $self->dealWarning();
                break;
            case E_NOTICE://通知级别
            case E_USER_NOTICE:
                return $self->dealNotice();
                break;
            default:
                return false;
        }
    }

    /**
     * 如何处理致命错误
     */
    public function dealError()
    {
        //开启内存缓冲
        ob_start();
        //回溯上一条信息
        debug_print_backtrace();
        $backtrace = ob_get_flush();
        $errorMsg = <<<EOF
        出现了致命错误,如下:
产生错误的文件:{$this->filename}
产生错误的信息:{$this->message}
产生错误的行号:{$this->line}
追踪信息:{$backtrace}
EOF;
//    error_log($errorMsg,1,&#39;xxxx@qq.com&#39;);
        error_log($errorMsg,3,$this->_noticelog);
        exit(1);
    }

    /**
     * 如何处理警告错误
     */
    public function dealWarning()
    {
        $errorMsg = <<<EOF
        出现了警告错误,如下:
产生警告的文件:{$this->filename}
产生警告的信息:{$this->message}
产生警告的行号:{$this->line}
EOF;
//        return error_log($errorMsg,1,&#39;xxx@qq.com&#39;);
        return error_log($errorMsg,3,$this->_noticelog);
    }

    /**
     * 如何处理通知错误
     */
    public function dealNotice()
    {
        $datetime = date(&#39;Y-m-d H:i:s&#39;,time());
        $errorMsg = <<<EOF
        出现了通知错误,如下:
产生通知的文件:{$this->filename}
产生通知的信息:{$this->message}
产生通知的行号:{$this->line}
产生通知的时间:{$datetime}
EOF;
        return error_log($errorMsg,3,$this->_noticelog);
    }
}

3.3 错误处理器测试

require_once &#39;MyErrorHandler.php&#39;;
error_reporting(-1);
//使用MyErrorHandler类直接调用deal方法
/**
 * set_error_handler(array(类名/new 类名,方法名));
 * set_error_handler(函数名);
 */
set_error_handler(array(&#39;MyErrorHandler&#39;,&#39;deal&#39;));

//通知级别错误
echo $test;
//警告级别错误
settype($var,&#39;king&#39;);
//致命错误
//test();

//总结:手动抛出的信息会被显示在浏览器
trigger_error(&#39;我是手动抛出的致命错误&#39;,E_USER_ERROR);

echo &#39;this is a test &#39;;

3.4 register_shutdown_function函数使用

     PHP プログラマーが遭遇するエラーと例外 パート 1 エラー

     使用场景:

  1. 页面强制被停止

  2. 程序代码意外终止或超时

     PHP プログラマーが遭遇するエラーと例外 パート 1 エラー

     register_shutdown_function()函数是从内存中调用的,也就是PHP语句执行完之后(页面已不存在了)再调用这个函数,所以写路径的时候已经脱离这个脚本了,所以file_put_contents()路径要用绝对路径

error_get_last # 得到最后产生的错误

     注意:如果在register_shutdown_function() 之前有die/exit则不会被执行

未完!待续下篇:那些年,PHPer遇到的错误与异常:下篇之异常

Notice 通知レベルのエラー (不適切な構文が原因で、PHP の通常の動作には影響しません。 as print 未定義の変数なので、最初から適切な記述方法を開発する必要があります)

Warning警告レベルのエラー (コードを変更する必要があります)


Fatal error / code>致命的レベルのエラー、

プログラムは停止します🎜🎜🎜🎜🎜解析エラー構文解析エラー、コードを実行する前に確認してください、🎜は実行されませんコード🎜🎜🎜🎜🎜E_USER_関連エラー ユーザーによって定義されたエラー、手動でエラーをスローするときに使用されます🎜🎜🎜🎜1.3 エラーレベルの設定方法🎜

1.3 .1 php.ini設定ファイル

rrreee

1.3.2 動的設定

rrreee

1.3.3 実行時の設定オプションの値の設定

rrreee🎜14.trigger_error 手動トリガーエラー 🎜🎜 を送信します。 @ エラー サプレッサーを使用して、行にエラーが表示されないように行の先頭に配置します 🎜🎜 カスタム エラー メッセージを手動でスローします: trigger_error('error prompt content',E_USER_NOTICE)🎜🎜 <span class="img-wrap"><img src="https://img.php.cn/upload/article/000/153/291/bc95c4ca7986535b3f43e1931936f826-0.png" alt="PHP プログラマーが遭遇するエラーと例外 パート 1 エラー" > span> 🎜🎜 🎜エラーレベル: 🎜🎜rrreee🎜 2. PHP でエラーを処理する 🎜🎜2.1 エラーログを指定したファイルに保存する 🎜rrreee🎜2.2 エラーログをシステムログに保存する 🎜rrreee🎜2.3 エラーログを送信するemail🎜 rrreee🎜3. カスタムエラーハンドラー🎜🎜3.1 set_error_handler カスタムエラーハンドラー🎜rrreee🎜 <span class="img-wrap"><img src="https://img.php.cn/upload/article/000%20/%20153/291/bc95c4ca7986535b3f43e1931936f826-1.png" alt="PHP プログラマーが遭遇するエラーと例外 パート 1 エラー" ></span>🎜🎜3.2 カスタムエラーハンドラー🎜rrreee🎜3.3 エラーハンドラーテスト🎜rrreee🎜3.4 Register_shutdown_function 関数の使用法🎜🎜 pan class="img-wラップ ><img src="https://img.php.cn/upload/article/000/153/291/343353203eb64e8381aa8c57bde2c869-2.png" alt="PHP プログラマーが遭遇するエラーと例外 パート 1 エラー" ></span>🎜🎜 🎜使用シナリオ: 🎜🎜🎜🎜🎜 ページが強制的に停止されました🎜🎜🎜🎜プログラム コードが予期せず終了したか、タイムアウトしました🎜🎜🎜 /291/343 353203eb64e8381aa8c57bde2c869-3.png"/>🎜🎜 <code>register_shutdown_function()関数は 🎜 ですメモリから呼び出されます🎜、つまり、PHPステートメントが実行されます。この関数は後で呼び出されます(ページはもう存在しません)。そのため、パスを記述するとき、すでにスクリプトの外にあるため、file_put_contents( )🎜パスには絶対パスを使用する必要があります🎜🎜 rrreee🎜 🎜注: 🎜 register_shutdown_function() の前に <code>die/exit がある場合コード>、実行されません 🎜🎜🎜未完了!次の記事に続きます: 🎜これらの年に PHPer で遭遇したエラーと例外: 次の記事の例外🎜🎜🎜参考コース ビデオ: これらの年に遭遇したエラーと例外🎜🎜🎜🎜 🎜🎜🎜🎜

以上がPHP プログラマーが遭遇するエラーと例外 パート 1 エラーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。