PHP
例外処理とエラー報告
サーチ…
エラー報告とその表示場所の設定
php.iniでまだ実行されていない場合は、エラー報告を動的に設定することができ、ほとんどのエラーを表示できるように設定する必要があります:
構文
int error_reporting ([ int $level ] )
例
// should always be used prior to 5.4
error_reporting(E_ALL);
// -1 will show every possible error, even when new levels and constants are added
// in future PHP versions. E_ALL does the same up to 5.4.
error_reporting(-1);
// without notices
error_reporting(E_ALL & ~E_NOTICE);
// only warnings and notices.
// for the sake of example, one shouldn't report only those
error_reporting(E_WARNING | E_NOTICE);
エラーはデフォルトでphpによって記録され、通常は実行中のスクリプトと同じレベルのerror.logファイルに記録されます。
開発環境では、それらを画面に表示することもできます。
ini_set('display_errors', 1);
しかし、生産においては、
ini_set('display_errors', 0);
例外ハンドラまたはエラーハンドラを使用してフレンドリーな問題メッセージを表示します。
例外とエラー処理
試してみる
try..catch
ブロックは、 例外がスローされる可能性のあるプログラムのフローを制御するために使用できます。 PHPが遭遇したときに停止させるのではなく、優雅に捕まえることができます:
try {
// Do a bunch of things...
throw new Exception('My test exception!');
} catch (Exception $ex) {
// Your logic failed. What do you want to do about that? Log it:
file_put_contents('my_error_log.txt', $ex->getMessage(), FILE_APPEND);
}
上記の例では、 try
ブロックにスローされたExceptionをcatch
、そのメッセージ( "My test exception!")をテキストファイルに記録します。
異なる例外タイプをキャッチする
さまざまな種類の例外に対して複数のcatch
ステートメントを実装して、異なる方法で処理することができます。たとえば、次のようになります。
try {
throw new InvalidArgumentException('Argument #1 must be an integer!');
} catch (InvalidArgumentException $ex) {
var_dump('Invalid argument exception caught: ' . $ex->getMessage());
} catch (Exception $ex) {
var_dump('Standard exception caught: ' . $ex->getMessage());
}
上記の例では、最初のcatch
は実行の順番で最初に一致するので使用されます。 catch
ステートメントの順序を入れ替えた場合、 Exception
キャッチャーが最初に実行されます。
同様に、 UnexpectedValueException
をスローする代わりに、標準Exception
第2のハンドラが使用されていることがわかります。
最後に
try
またはcatch
実行が終了した後で何かが必要な場合は、 finally
ステートメントを使用できます。
try {
throw new Exception('Hello world');
} catch (Exception $e) {
echo 'Uh oh! ' . $e->getMessage();
} finally {
echo " - I'm finished now - home time!";
}
上記の例では、次のように出力されます。
ええとああ!こんにちは世界 - 私は今終わった - ホームタイム!
投棄可能な
PHP 7では、私たちはの導入を参照Throwable
インタフェースを、 Error
などException
実装しています。これにより、PHP 7の例外の間にサービスコントラクトレベルが追加され、独自のカスタム例外のインターフェイスを実装できます。
$handler = function(\Throwable $ex) {
$msg = "[ {$ex->getCode()} ] {$ex->getTraceAsString()}";
mail('[email protected]', $ex->getMessage(), $msg);
echo myNiceErrorMessageFunction();
};
set_exception_handler($handler);
set_error_handler($handler);
PHP 5より前では、すべての例外クラスがそれを継承しているので、単に型入力Exception
することができます。
致命的なエラーの記録
PHPでは、致命的なエラーは捕らえられない種類のエラーです。つまり、致命的なエラーが発生した後にプログラムが再開しない場合です。ただし、このエラーを記録するか、何らかの形でクラッシュを処理するには、 register_shutdown_function
を使用してシャットダウンハンドラを登録します。
function fatalErrorHandler() { // Let's get last error that was fatal. $error = error_get_last(); // This is error-only handler for example purposes; no error means that // there were no error and shutdown was proper. Also ensure it will handle // only fatal errors. if (null === $error || E_ERROR != $error['type']) { return; } // Log last error to a log file. // let's naively assume that logs are in the folder inside the app folder. $logFile = fopen("./app/logs/error.log", "a+"); // Get useful info out of error. $type = $error["type"]; $file = $error["file"]; $line = $error["line"]; $message = $error["message"] fprintf( $logFile, "[%s] %s: %s in %s:%d\n", date("Y-m-d H:i:s"), $type, $message, $file, $line); fclose($logFile); } register_shutdown_function('fatalErrorHandler');
参照:
- http://php.net/manual/en/function.register-shutdown-function.php
- http://php.net/manual/en/function.error-get-last.php
- http://php.net/manual/en/errorfunc.constants.php