set_error_handlerではfatal errorはハンドリングしてくれない

  • 8
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

問題点

set_error_handlerは、phpのERRORやNOTICEなどが発生した際に実行する関数を指定できるが、FATAL_ERROR(例外)の場合は関数を実行してくれない。

not_working.php
set_error_handler('error_handler');

throw new Exception('hoge');

function('error_handler')
{
    echo 'ERROR!!';
}

上記では'ERROR!!'は出力されない

解決策

register_shutdown_functionという関数を使う。

working.php
register_shutdown_function('shutdown_handler');

throw new Exception('foo');

function('shutdown_handler')
{
    echo 'ERROR!!';
}

上記は'ERROR!!'が出力される。

メソッド指定の場合

set_error_handlerもそうだが、メソッドを指定したい場合は

use_method.php
$foo = new Foo();
register_shutdown_function(array($foo, 'bar'));


class Foo{
    function bar()
    {
        echo 'ERROR!!';
    }
}

このように行う。

補足1

今回に限っては解決しますが、FATAL_ERRORを拾っているというわけではないので、厳密には違いますね・・・。まあphpのFATAL_ERRORは回避できないっぽいのでほぼ同義なのでしょうが、なにかいい方法を知ってる方いましたら教えて下さいませ。

詳細はマニュアルページを見て下さい。

補足2

set_exception_handlerのほうが適切かもしれない。

参考