サーチ…


エラー報告とその表示場所の設定

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');

参照:



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow