PHP異常とエラー

20527 ワード

一、PHPの異常とエラー
例外:プログラムの実行中に予想に合致しない場合、および通常のプロセスとは異なる場合.1つの異常な状況は、正常な論理に従ってエラーを犯すべきではありませんが、エラーが発生しても、文法エラーではなく、論理とビジネスプロセスの中断に属します.PHPはアクティブthrow後のみ異常をキャプチャできます(一般的にはそうですが、一部の異常PHPは自動的にキャプチャできます).
基礎知識:https://www.cnblogs.com/cshaptx4869/p/11210837.html
エラー:独自の問題であり、不正な構文や環境問題により、コンパイラがチェックできず、実行できない場合です.(簡単に言えばスクリプトを正常に動作させない場合)
基礎知識:https://www.cnblogs.com/cshaptx4869/p/11216353.html
 
二、エラーのレベル
大きく分けていくつかの種類があります.
1、deprecated、最下位レベルのエラーは、「推奨しない、推奨しない」を表します.一般的には、推奨されていない、古い関数や構文の使用によるものです.PHPの正常な流れには影響しませんが、一般的には修正をお勧めします.
2、notice、一般的に文法に不適切なところがあることを教えてあげます.使用する変数が定義されていない場合、配列インデックスが文字の場合、引用符が付けられていない場合、phpは定数として検索され、変数として認識されません.
PHPの正常な流れに影響しない.
3、warning、比較的高いエラーは、関数パラメータが一致しないなど、文法に不適切な場合に報告されます.このレベルでは、予想される結果が得られないため、コードを変更する必要があります.
4、fetal error、致命的なエラー、直接PHPプロセスの終結を招き、後のコードはもう実行しない.たとえば、存在しないメソッドを呼び出すと、このエラーは処理されます.
5、prase error、最高レベルのエラー、構文解析エラー.文法検査の段階でエラーが発生し、PHPが文法検査に合格できなくなった.
PHPマニュアルでは16レベルのエラーが定義されていますが、最も一般的なのはこれだけです.
レベルの可能な値:
値定数の説明
1     E_ERROR                  。      ,      。
2     E_WARNING              (      )。        ,        。
4     E_PARSE                  。           。
8     E_NOTICE               (          bug   ,            。)
16 E_CORE_ERROR PHP 。 32 E_CORE_WARNING PHP ( )。
64 E_COMPILE_ERROR 。 Zend E_ERROR。 128 E_COMPILE_WARNING ( )。 Zend E_WARNING 。
256 E_USER_ERROR 。 PHP trigger_error( E_ERROR) 512 E_USER_WARNING 。 PHP trigger_error( E_WARNING ) 1024 E_USER_NOTICE 。 PHP trigger_error( E_NOTICE )
2048 E_STRICT 。 PHP 。 4096 E_RECOVERABLE_ERROR 。 E_ERROR, ( set_error_handler()) 8191 E_ALL ( E_STRICT) (E_STRICT will be part of E_ALL as of PHP 6.0) 16384 E_USER_DEPRECATED 30719 E_ALL

 
推薦ブログ:http://www.cnblogs.com/zyf-zhaoyafei/p/3649434.html
 
三、PHPにおけるエラー処理メカニズム
set_error_handler関数はPHPエラー処理を引き継ぎ、trigger_を使用することもできます.Error関数はアクティブにエラーを投げ出します.
set_error_handler(error_function, error_types)
ユーザー定義のエラー処理関数を設定します.関数は、実行中のユーザー独自のエラー処理方法を作成するために使用します.エラー処理関数を作成してから、エラーレベルを設定する必要があります.
パラメータの説明:
  error_function($errno,$errstr,$errfile,$errline):エラーが発生したときに実行する関数を指定します.必要です.ユーザの関数は、エラーコードとエラーを記述するstringの2つのパラメータを受け入れる必要があります.また、エラーが発生したファイル名、エラーが発生した行番号、およびエラーが発生したコンテキスト(エラーが発生したときのアクティブシンボルテーブルを指すarray)の3つのオプションパラメータを指定することもできます.
複数の呼び出しをサポート:
php
     //        NonClassFunction
     set_error_handler('function_name'); 

     //   class_name && function_name
     set_error_handler(array('class_name', 'function_name')); 
?>

  error_type:ユーザー定義のエラーがどのエラーレポートレベルで表示されるかを指定します.オプション.デフォルトはE_ALL | E_STRICT.
注意:この関数を使用すると、標準のPHPエラー処理関数(@記号を含むerror_reporting()を完全に迂回し、必要に応じてユーザー定義のエラー処理プログラムがスクリプトを終了する必要があります(die()スクリプトの実行前にエラーが発生した場合、カスタムプログラムはまだ登録されていないため、このカスタムエラーハンドラは使用されません.したがって、一般的には先頭に定義されます.また、以下のレベルのエラーは、ユーザ定義関数によって処理できません.E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNINGおよびset_を呼び出すerror_handler()関数が存在するファイルのほとんどE_STRICT.システムによって発生したWarning、Notice、Deprecatedレベルのエラーのみをキャプチャできます.
 
同じページでrestore_を使用できます.error_handler()関数は、カスタム関数の引き継ぎをキャンセルします.
 
register_shutdown_function()は、PHPプログラムの終了またはdie()時に関数をトリガーし、PHPに短いリターンを与えます.PHPキャプチャエラー:Fatal Error、Parse Errorなど
error_get_last();この関数は、今回の実行で発生したすべてのエラーを取得できます.error_get_last();配列の情報を返します:[type]-エラータイプ[message]-エラーメッセージ[file]-エラーが発生したファイル[line]-エラーが発生した行
 
 set_exception_handler()は、デフォルトの例外ハンドラを設定し、try/catchブロックでキャプチャされていない例外、すなわち、投げ出された例外がキャプチャされているかどうかにかかわらず、キャプチャされていない場合はメソッドに入り、コールバック関数呼び出し後に例外が中止されます.
 
php

error_reporting(0);
echo '
';

register_shutdown_function('myShutDown');
set_error_handler('myError');
set_exception_handler('myException');


function myError($code, $msg, $file, $line)
{
    var_dump(compact('code', 'msg', 'file', 'line'));
}

function myShutDown()
{
    $data = error_get_last();
    if(is_null($data)){
        var_dump('nothing error');
    } else {
        var_dump('error',$data);
    }
}

function myException($e)
{
    var_dump('myException:'.$e->getMessage());
}

// require 'a.php';
// throw new Exception("throw exception", 1);
// trigger_error('throw-error', E_USER_ERROR);
try{
    fun();
}catch(Exception $e){
    var_dump('Exception:'.$e->getMessage());
}catch(Throwable $e){ 
  // php7
  var_dump('Throable:'.$e->getMessage()); }finally{ var_dump('finally'); }

thinkphp 5.1のエラー メカニズム:
    public static function register()
    {
        error_reporting(E_ALL);
        set_error_handler([__CLASS__, 'appError']);
        set_exception_handler([__CLASS__, 'appException']);
        register_shutdown_function([__CLASS__, 'appShutdown']);
    }

   /**
     * Error Handler
     * @access public
     * @param  integer $errno       
     * @param  integer $errstr        
     * @param  string  $errfile      
     * @param  integer $errline     
     * @throws ErrorException
     */
    public static function appError($errno, $errstr, $errfile = '', $errline = 0)
    {
        $exception = new ErrorException($errno, $errstr, $errfile, $errline);
        if (error_reporting() & $errno) {
            //          think\exception\ErrorException
            throw $exception;
        }

        self::getExceptionHandler()->report($exception);
    }

   /**
     * Exception Handler
     * @access public
     * @param  \Exception|\Throwable $e
     */
    public static function appException($e)
    {
        if (!$e instanceof \Exception) {
            $e = new ThrowableError($e);
        }

        self::getExceptionHandler()->report($e);

        if (PHP_SAPI == 'cli') {
            self::getExceptionHandler()->renderForConsole(new ConsoleOutput, $e);
        } else {
            self::getExceptionHandler()->render($e)->send();
        }
    }

   /**
     * Shutdown Handler
     * @access public
     */
    public static function appShutdown()
    {
        if (!is_null($error = error_get_last()) && self::isFatal($error['type'])) {
            //         think\ErrorException
            $exception = new ErrorException($error['type'], $error['message'], $error['file'], $error['line']);

            self::appException($exception);
        }

        //     
        Container::get('log')->save();
    }

demo:
a.php  :
php
    //   Fatal error  
    //test();

    //       ERROR  
    //trigger_error('zyf-error', E_USER_ERROR);

    //       
    var_dump(23+-+);

    //   Notice  
    //echo $f;

    //   Warning  
    //echo '123';
    //ob_flush();
    //flush();
    //header("Content-type:text/html;charset=gb2312");


b.php  :
php
    error_reporting(0);
    register_shutdown_function('zyfshutdownfunc');
    function zyfshutdownfunc()
    {
        if ($error = error_get_last()) {
            var_dump('register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '');
        }
    }

    set_error_handler('zyferror');
    function zyferror($type, $message, $file, $line)
    {
        var_dump('set_error_handler: ' . $type . ':' . $message . ' in ' . $file . ' on ' . $line . ' line .
'); } require 'a.php';

に でphpの を する.ini error_report(0). 
   display_errorsエラーエコー、 な モデルですが、 くのアプリケーションが な でこのオプションを じることを れています.エラーエコーは に くの を し、 の の に を することができる.このオプションをオフにすることをお めします.ある が されると、 のことはdisplay_errorsオプションは、これらのエラーが らかにしたパス、データベース 、データテーブルなどの によってハッカーに されないようにオフにします.
Onはオープン でエラーが した にエラーを し、エラーメッセージが したことを す.Offはクローズ で、エラーが した はサーバエラーというメッセージが されます.エラーメッセージは されません
  log_errors 
な でこれを えばいいので、エラーメッセージをログに します.エラーエコーをオフにできます.ある を して した 、PHPのロゴをerrorsがオープンし、デフォルトはWEBサーバのログファイルに されます. えばApacheのerror.logファイル.もちろん、 したファイルにエラーログを することもできます.またerror_を することもできますlog=syslogは、これらのエラー をオペレーティングシステムのログに します.
1 # vim /etc/php.inidisplay_errors = Off
2 log_errors = On
3 error_log = /var/log/php-error.log 

       
  PHP.iniでdisplay_errors=Off の :PHP ファイルphp.iniではdisplayが されているのにerrors=Offですが、 はページにエラーメッセージが されます. : みlog_errors=On、 によると、このlog_errorsがOnに されている は、error_を する があります.logファイルは、 されたファイルまたは されたファイルに き む がなければ、 の チャネルに され、display_errorsという されたOffが になり、エラーメッセージが されました.そしてlog_errors=Offで、 は しました.
 
、PHP 7による の
PHP 7はグローバルなThrowableインタフェースを し、 のExceptionと のErrorはこのインタフェースを し、インタフェースの で な を した. ,ほとんどのエラーはError として げ されているが,まだ であり, のエラーだけがThrowableインタフェースを している.
このError は、Exception のように、 に するtry/catchブロックによってキャプチャされ る. するcatchブロックがない は、 (set_exception_handler)を び して します.この が されていない は、 の で されます.
php
    try {
        test();

    } catch(Throwable $e) {
        echo $e->getMessage() . ' zyf';
    }

    try {
        test();

    } catch(Error $e) {
        echo $e->getMessage() . ' zyf';
    }

 
 
ドキュメント:https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html