コンテンツにスキップ

PHP/エラーハンドリング

出典: フリー教科書『ウィキブックス(Wikibooks)』
< PHP

エラーハンドリング

[編集]

エラーハンドリングの基礎

[編集]

PHPではエラーを適切にキャッチし、処理を続行するための仕組みが提供されています。以下は基本的なtry-catch構文の例です。

<?php
try {
    // エラーを発生させるコード
    if (!file_exists('example.txt')) {
        throw new Exception('ファイルが見つかりません。');
    }
    $content = file_get_contents('example.txt');
    echo $content;
} catch (Exception $e) {
    // エラー処理
    echo "エラー: " . $e->getMessage();
}
?>

カスタム例外クラス

[編集]

独自の例外クラスを作成して特定のエラーを処理できます。

<?php
class CustomException extends Exception {}

try {
    $value = -1;
    if ($value < 0) {
        throw new CustomException('値は0以上である必要があります。');
    }
} catch (CustomException $e) {
    echo "カスタム例外: " . $e->getMessage();
} catch (Exception $e) {
    echo "一般例外: " . $e->getMessage();
}
?>

エラーログの記録

[編集]

エラーをログファイルに記録することで、運用中の問題を追跡できます。

<?php
try {
    throw new Exception('重大なエラーが発生しました。');
} catch (Exception $e) {
    error_log($e->getMessage(), 3, 'error.log');
    echo "エラーが記録されました。";
}
?>

カスタムエラーハンドラー

[編集]

独自のエラーハンドラーを定義してエラー処理をカスタマイズできます。

<?php
function customErrorHandler($errno, $errstr, $errfile, $errline) {
    echo "エラー [$errno]: $errstr - $errfile:$errline\n";
    // 必要に応じてエラーログに記録
    error_log("エラー [$errno]: $errstr - $errfile:$errline", 3, 'error.log');
    return true; // 標準のエラーハンドリングをスキップ
}

// カスタムエラーハンドラーを設定
set_error_handler('customErrorHandler');

// 意図的にエラーを発生
echo $undefinedVariable;
?>

致命的エラーの処理

[編集]

register_shutdown_functionを使って致命的エラーをキャッチできます。

<?php
register_shutdown_function(function() {
    $error = error_get_last();
    if ($error) {
        echo "致命的エラー: " . $error['message'];
        error_log("致命的エラー: " . $error['message'], 3, 'error.log');
    }
});

// 意図的に致命的エラーを発生
undefinedFunction();
?>

例外とエラーの統一

[編集]

Errorクラスを使用して致命的エラーを例外として処理できます。

<?php
try {
    // 型エラーを発生
    $result = 1 / 0;
} catch (Error $e) {
    echo "エラーキャッチ: " . $e->getMessage();
}
?>