PHPでの例外と処理

WBOY
リリース: 2016-06-20 12:45:14
オリジナル
990 人が閲覧しました

一般的なエラー処理タイプ

  • 構文エラー

  • 環境エラー

  • 論理エラー

一般的なエラー レベル

  • 非推奨の最低レベルのエラー

    • 非推奨、非推奨期限切れの関数を使用する場合、プログラムは実行を継続することをお勧めします。

  • 通知レベル エラー

    • を使用するいくつかの未定義の変数、定数、または配列キーは引用符で囲まれていない場合に表示され、プログラムは実行を継続します

  • 下降警告レベルのエラー

    • プログラムに問題があるため、コードを修正する必要があります。 ! !プログラムは実行を継続します

  • 致命的エラー エラー レベル エラー

    • プログラムはエラーを直接報告し、コードには修正されます! ! !プログラムの実行を中断します

  • 解析エラー 構文解析エラー

    • 構文チェックフェーズとコード中にエラーが報告されます変更する必要があります! ! !プログラムの実行を中断します

  • E_USER_ 関連エラー

    • ユーザー定義エラー、ユーザーが手動でエラーをスロー、続行 カスタム エラー

PHP 構成ファイルとエラー関連オプション

エラー レベルの設定
1. php.ini ファイルを変更して設定します。 、静的設定、Apache を再起動する必要があります
// error_reporting = E_ALL&~E_NOTICE; // E_NOTICE レベルを除くすべてのエラーを表示します
// display_errors = 1 // オフラインを有効にして、最初に閉じます

2. error_reporting() 関数を使用して動的に設定します
// error_reporting(E_ALL&~E_NOTICE) // E_NOTICE レベルを除くすべてのエラーを表示します
// error_reporting(0); // すべてのエラーのみを表示します構文解析エラーが表示されます
// erorr_reporting(-1); // すべてのエラーが表示されます

3. 実行時設定は、ini_set() 関数を通じて実行され、動的設定は
// ini_set( 'error_reporting',0);
// ini_set('error_reporting',-1);
// ini_set('display_errors',0);

次の場合にtrigger_errorを使用しますerror throwsing

<?phpheader('content-type:text/html;charset=utf-8');$num1=1;$num2='xxx';if ( (!is_numeric($num1) || !is_numeric($num2)) ) {    //通知级别,代码继续执行    //echo trigger_error('数值必须为整型!',E_USER_NOTICE);         //警告级别,代码继续执行    //echo trigger_error('数值必须为整型!',E_USER_WARNING);         //错误级别,代码中断    echo trigger_error('数值必须为整型!',E_USER_ERROR); }else{    echo $num1+$num2;}echo '<br />代码继续执行';
ログイン後にコピー

エラーを記録する

エラーを記録するように php.ini スクリプト設定を構成します
log_errors = On //エラー情報をログまたは error_log に記録するかどうか
;error_log = syslog / / システム ログに記録されるスクリプト エラーを設定します
log_errors_max_len = 1024 // エラー報告の最大値をバイト単位で設定します
ignore_repeat_errors = Off // 繰り返されるエラー メッセージを無視するかどうか
ignore_repeat_source = Off //はい 重複したエラー メッセージのソースを無視します
track_errors = On //オンにすると、最後のエラーは常に $php_errormsg に保存されます

指定されたファイルにエラーを記録します

<?php//运行时设置错误处理ini_set('display_errors','off');ini_set('error_log','D:\logs\error.log');//设置错误输出error_reporting(-1);echo $test; //NOTICEecho '<hr />';settype($var,'king'); //Warningecho '<hr />';test(); //Fatal error
ログイン後にコピー

ログ ファイルをシステム ログに保存します

<?phperror_reporting(-1);ini_set('display_errors',0);ini_set('log_errors',1);ini_set('error_log','syslog');//该记录方式,在windows中需要去,计算机管理-》事件查看器-》自定义视图中查找php5.4.0的log日志openlog('PHP5.4.0',LOG_PID,LOG_SYSLOG);syslog(LOG_ERR,'this is syslog !!!daye:'.date('Y/m/d H:i:s'));closelog();
ログイン後にコピー

エラーを電子メールとして送信
1. まず、電子メール サーバーを設定する必要があります。
2. php.ini でメールパラメータを設定します
3. コードを記述します

error_log('当前系统被人攻击!产生错误!',1,'87399497@qq.com');
ログイン後にコピー

error_log 関数を使用します

error_log($msg); //传入错误记录,需要与error_log配置使用
ログイン後にコピー

Set_error_handler() の使用方法

<?phpheader('content-type:text/html;charset=utf-8');//-1代表显示所有的错误警告error_reporting(-1);/** * 自定义一个错误处理 * @param  [type] $errno  [错误级别] * @param  [type] $errmsg [错误信息] * @param  [type] $file   [错误文件] * @param  [type] $line   [错误行号] * @return [type]         [description] */function customer_error($errno,$errmsg,$file,$line){    echo "<b>错误代码:</b>[{$errno}] {$errmsg} <br/>".PHP_EOL;    echo "<b>错误行号:</b>{$file}文件中的第 {$line} <br/>".PHP_EOL;    echo "<b>PHP版本:</b>".PHP_VERSION."(".PHP_OS.") <br/>".PHP_EOL;    //注意:如果自定义错误处理捕获了,代码还是会执行,如果不想被执行,需要die掉!!!    //die;}//设置自定义错误处理set_error_handler('customer_error');//输出一个未定义变量的警告echo $test;echo '<hr/>';//原生出错//Notice: Undefined variable: test in D:\phpStudy\WWW\example\index.php on line 26//自定义出错//错误代码:[8] Undefined variable: test //错误行号:D:\phpStudy\WWW\example\index.php文件中的第 26 //PHP版本:5.3.29(WINNT) //无法捕获一个致命错误Fatal error,会切换到原生出错//test();//手动抛出一个错误,被自定义的错误处理捕获trigger_error('this is a test of error',E_USER_ERROR);echo 'contiune';echo '<hr/>';//错误代码:[256] this is a test of error //错误行号:D:\phpStudy\WWW\example\index.php文件中的第 43 //PHP版本:5.3.29(WINNT) //contiune//取消自定义错误处理,将会重新适应PHP原生的错误处理restore_error_handler();echo $tt;echo '<hr />';//Notice: Undefined variable: tt in D:\phpStudy\WWW\example\index.php on line 49//重新挂载自定义错误处理//除了NOTICE级别的交给系统处理,剩下的全部使用customer_error自定义的错误处理set_error_handler('customer_error',E_ALL&~E_NOTICE);echo $asc; //E_NOTICE级别,系统的错误处理settype($var,'king'); //E_WARNING级别,使用自定义的错误处理//Notice: Undefined variable: asc in D:\phpStudy\WWW\example\index.php on line 65//错误代码:[2] settype() [function.settype]: Invalid type //错误行号:D:\phpStudy\WWW\example\index.php文件中的第 66 //PHP版本:5.3.29(WINNT) 
ログイン後にコピー

エラー ハンドラーのカスタマイズ

<?phpclass MyErrorHandler{        public $msg='';    public $filename='';    public $line=0;    public $vars=array();    public function __construct($msg,$filename,$line,$vars){        $this->msg = $msg;        $this->filename = $filename;        $this->line = $line;        $this->vars = $vars;    }    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;                break;        }    }    /**     * 处理致命错误     * @return [type] [description]     */    public function dealError(){        ob_start();        debug_print_backtrace();        $backtrace = ob_get_flush();        $errmsg = <<<EOF出现了致命错误,如下:产生错误的文件:{$this->filename}产生错误的信息:{$this->msg}产生错误的行号:{$this->line}追踪信息:{$backtrace}EOF;        //发送邮件的错误日志        //error_log($errmsg,1,'87399497@qq.com');        //记录到错误日志        error_log($errmsg,3,'D:/logs/customer_error.log');        exit(1);    }    /**     * 处理警告错误     * @return [type] [description]     */    public function dealWarning(){        $errmsg = <<<EOF出现了警告错误,如下:产生警告的文件:{$this->filename}产生警告的信息:{$this->msg}产生警告的行号:{$this->line}EOF;        error_log($errmsg,3,'D:/logs/customer_warning.log');    }    /**     * 处理通知级别的错误     * @return [type] [description]     */    public function dealNotice(){        $date = date('Y-m-d H:i:s',time());        $errmsg = <<<EOF出现了通知错误,如下:产生错误的文件:{$this->filename}产生错误的信息:{$this->msg}产生错误的行号:{$this->line}产生通知的时间:{$date}EOF;        error_log($errmsg,3,'D:/logs/customer_notice.log');    }}//显示所有错误error_reporting(-1);//设置自定义错误,使用传入类和方法的方式set_error_handler(array('MyErrorHandler','deal'));//触发NOTICE级别错误,会保存到log日志中echo $tt;//手动触发一个错误trigger_error('手动抛出一个错误',E_USER_ERROR);
ログイン後にコピー

register_shutdown_function() 関数

<?php //register_shutdown_function该函数将会在PHP执行关闭时调用//使用场景//1、页面强制停止//2、代码意外终止class Showdown{    public static function endScript(){        if (error_get_last()){            echo '<pre class="brush:php;toolbar:false">';            error_get_last();            echo '
'; //因为register_shutdown_function调用该函数的时候,是代码终止,脱离当前PHP上下文环境了 //所以$filename的路径要写决定路径!!! file_put_contents('D:\logs\register_shutdown_function.log', error_get_last()); die('endScript'); } }}//特别声明!如果有die或exit在注册错误处理之前,那么将不会注册错误处理register_shutdown_function(array('Showdown','endScript'));echo md6();
ログイン後にコピー

エラー サプレッサー

@settype($var,'longjq'); //无变量$var,使用@符号进行抑制错误输出
ログイン後にコピー

エラー レベル

http://www.w3school.com.cn/php/php_ref_error.asp

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート