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レベルのエラーが定義されていますが、最も一般的なのはこれだけです.
レベルの可能な値:
値定数の説明
推薦ブログ: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つのオプションパラメータを指定することもできます.
複数の呼び出しをサポート:
error_type:ユーザー定義のエラーがどのエラーレポートレベルで表示されるかを指定します.オプション.デフォルトはE_ALL | E_STRICT.
注意:この関数を使用すると、標準のPHPエラー処理関数(@記号を含むerror_reporting()を完全に迂回し、必要に応じてユーザー定義のエラー処理プログラムがスクリプトを終了する必要があります(die()スクリプトの実行前にエラーが発生した場合、カスタムプログラムはまだ登録されていないため、このカスタムエラーハンドラは使用されません.したがって、一般的には先頭に定義されます.また、以下のレベルのエラーは、ユーザ定義関数によって処理できません.
同じページで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ブロックでキャプチャされていない例外、すなわち、投げ出された例外がキャプチャされているかどうかにかかわらず、キャプチャされていない場合はメソッドに入り、コールバック関数呼び出し後に例外が中止されます.
例外:プログラムの実行中に予想に合致しない場合、および通常のプロセスとは異なる場合.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_ERROR
、E_PARSE
、E_CORE_ERROR
、E_CORE_WARNING
E_COMPILE_ERROR
E_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