コード例 … Fatalエラー

PHP用語集

カテゴリー: register_shutdown_function  閲覧数:1003 配信日:2014-03-27 19:34


Fatalエラー


未定義関数呼び出し/致命的かつ復帰できない場合
・set_error_handler()だけでは、Warning:エラー(0 除算)のエラーハンドリングは出来ても、Fatal error: エラー(未定義関数呼び出し/致命的かつ復帰できない場合)のエラーハンドリングは出来ない
・これは Fatal error (致命的エラー) の箇所で、スクリプトが終了処理してしまい、ユーザー定義のエラーハンドラ関数が呼び出されないため
・処理が最後まで到達していないことは、Bye が表示されていないことからも確認できる
function my_error_handler ( $errno, $errstr, $errfile, $errline, $errcontext ) {
//     echo "[$errno] $errstr $errfile($errline)\n<br />";
    echo "[$errno] $errstr ($errline)\n<br />";
}

function my_shutdown_handler(){
    $isError = false;
    if ($error = error_get_last()){//最後に発生したエラーについての情報を取得。ここでは、foo();//未定義関数でエラー発生→Fatal error:
         switch($error['type']){
         case E_ERROR:
         case E_PARSE:
         case E_CORE_ERROR:
         case E_CORE_WARNING:
         case E_COMPILE_ERROR:
         case E_COMPILE_WARNING:
              $isError = true;
                     break;
             }
        }
    if ($isError){
         echo my_error_handler(
              $error['type'],
              $error['message'],
              $error['file'],
              $error['line'],
              null );
    }
}

ini_set( 'display_errors' , 0 );//エラー出力しない
error_reporting( E_ALL );// 全ての PHP エラーを表示(但し何を持って「全ての PHP エラー」と見做すかはバージョンにより異なる)
set_error_handler( 'my_error_handler', E_ALL );
register_shutdown_function( 'my_shutdown_handler' );

echo "Hello\n<br />";
$i = 5/0;//0 除算でエラー発生→Warning:
foo();//未定義関数でエラー発生→Fatal error:
echo "Bye\n<br />";

・処理結果
Hello
[2] Division by zero (59)
[1] Call to undefined function foo() (60)

Fatalエラーで確かに処理が終了していることの確認
・本来ならばset_error_handlerで補足できるWarnigエラーを、敢えてregister_shutdown_functionで補足するよう設定を行い、Fatalエラーの次にWarnigエラーを発生させ、最後のWarnigエラーまで処理が到達しないことを確認(Fatalエラーで処理が終了することを確認)
・処理が最後まで到達していないことは、Bye が表示されていないことからも確認できる
function my_error_handler ( $errno, $errstr, $errfile, $errline, $errcontext ) {
//     echo "[$errno] $errstr $errfile($errline)\n<br />";
    echo "[$errno] $errstr ($errline)\n<br />";
}

function my_shutdown_handler(){
    $isError = false;
    if ($error = error_get_last()){//最後に発生したエラーについての情報を取得。ここでは、foo();//未定義関数でエラー発生→Fatal error:
         switch($error['type']){
         case E_ERROR:
         case E_PARSE:
         case E_CORE_ERROR:
         case E_CORE_WARNING:
         case E_COMPILE_ERROR:
         case E_COMPILE_WARNING:
              $isError = true;
                     break;
         case E_WARNING://set_error_handlerで補足できるエラーを、敢えてregister_shutdown_functionで補足
              $isError = true;
                     break;
             }
        }
    if ($isError){
         echo my_error_handler(
              $error['type'],
              $error['message'],
              $error['file'],
              $error['line'],
              null );
    }
}

ini_set( 'display_errors' , 0 );//エラー出力しない
error_reporting( E_ALL );// 全ての PHP エラーを表示(但し何を持って「全ての PHP エラー」と見做すかはバージョンにより異なる)
//set_error_handler( 'my_error_handler', E_ALL );
register_shutdown_function( 'my_shutdown_handler' );

echo "Hello\n<br />";
$i = 5/0;//0 除算でエラー発生→Warning:
foo();//未定義関数でエラー発生→Fatal error:
$i = 5/0;//Fatal errorで処理が終了するため、ここまで処理は到達しない
echo "Bye\n<br />";

・処理結果
Hello
[1] Call to undefined function foo() (63)


週間人気ページランキング / 4-22 → 4-28
順位 ページタイトル抜粋 アクセス数
1 Warning: PDO::query(): LOAD DATA LOCAL INFILE forbidden | Warning(エラーメッセージ) 8
2 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 7
3 ブラウザを閉じたらセッションデータはどうなるの? | セッション 4
3 ブラウザを閉じたらセッションデータはどうなるの? | セッション 4
4 PHPで定数を定義する方法は2種類ある / 配列定数の定義 3
4 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 3
5 シリアライズ(シリアル化) | 関数 2
5 http_build_queryとは? / 構文 /パラメータ 2
5 set_error_handler | 例外処理(制御構造) 2
5 対応例1.メモリ不足なので、PHPの最大使用メモリを増加するよう変更 2
5 ( ! ) Fatal error: Uncaught Abraham\TwitterOAuth\TwitterOAuthException: timed out before SSL handshake | Fatal error(エラーメッセージ) 2
5 http_build_query | URLs(関数) 2
5 ob紛らわしい関数()一覧 | 出力バッファリング制御(関数) 2
5 コード例 … 「例外処理」はネストすることができる 2
6 Parse error: syntax error, unexpected $end in ○○.php on line △△ | Parse error(エラーメッセージ) 1
6 SQLインジェクション | セキュリティ 1
6 マジックメソッド(クラスとオブジェクト) カテゴリー 1
6 session.cookie_lifetime / session.use_cookies | セッション 1
6 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 1
6 ( ! ) Fatal error: Uncaught Abraham\TwitterOAuth\TwitterOAuthException: {"errors":[{"code":32,"message":"Could not authenticate you."}]} | Fatal error(エラーメッセージ) 1
2025/4/29 1:01 更新
指定期間人気ページランキング / 2020-5-28 → 2025-4-28
順位 ページタイトル抜粋 アクセス数
1 PHP用語 6680
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 2472
3 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 2405
4 ブラウザを閉じたらセッションデータはどうなるの? | セッション 1630
5 【テスト投稿】テスト | 1133
6 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 1045
7 PHPで定数を定義する方法は2種類ある / 配列定数の定義 932
8 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 857
9 curl で Cookie を使用する 817
9 コード例 … 「例外処理」はネストすることができる 817
10 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 815
11 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 803
12 定数 714
13 Fatal error: Uncaught RuntimeException: SplFileObject::__construct(): failed to open stream: Permission denied in | Fatal error(エラーメッセージ) 710
14 インターフェイス | クラスとオブジェクト 693
15 Fatal error: Uncaught HeadlessChromium\Exception\OperationTimedOut: Operation timed out (3sec) in | Fatal error(エラーメッセージ) 675
16 メンバー | クラスとオブジェクト 644
17 Warning: include() [function.include]: Failed opening '**.php' for inclusion (in | Warning(エラーメッセージ) 623
18 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column | Fatal error(エラーメッセージ) 592
19 Composer | 依存関係マネージャ 564
2025/4/29 1:01 更新