プロが教える店舗&オフィスのセキュリティ対策術

PHPでfatal errorが出ても無視して続行する方法はありませんでしょうか?

PHPバージョン 5.3.3

@(アットマーク エラー制御演算子)を入れてやってみましたが、エラーは表示されなくなりますが、それ以降の構文が実行されません。

warningは元々次に進むので良いのですが、fatal errorの場合、そこで終了してしまいそれ以降が実行できません。

・標準出力へのエラーメッセージの表示はあってもなくてもどっちでもいい。
・parse errorに関しては今回は続行しなくてもいい。(続行しても良い。)


try{
 エラーになるコード;
}catch(Exception $e){

}
ですべてのエクセプションを拾って次へ行くという方法が有ることはわかっていますが、例外以外のエラーではそこで強制終了してしまっています。

何とかエラーの出る次の行へ進む方法は無いでしょうか?
よろしくお願いいたします。

A 回答 (4件)

set_error_handler()などエラー処理をいれてみては?



http://www.php.net/manual/ja/book.errorfunc.php

たとえば、

<?PHP
print "x";
trigger_error("hoge", E_USER_ERROR);
print "y";
?>

を実行すると、xが表示された後Fortal errorが発生してyは表示されません。
こうすると、フォータルエラーをつかんで復帰します
エラーの種類によってcaseを分けて処理していけばよいでしょう。
(さすがにシンタックスエラーは回避できないとおもいますが)

<?php
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
switch ($errno) {
case E_USER_ERROR:
print "致命的なエラー つづく...<br>";
break;
default:
print "その他のエラー";
break;
}
return true;
}
$old_error_handler = set_error_handler("myErrorHandler");
print "x";
trigger_error("hoge", E_USER_ERROR);
print "y";
?>
    • good
    • 0
この回答へのお礼

http://keicode.com/cgi/php-error-handling.php
結局次に進めるのはtrycatchで拾える分のみにして、それ以外は上記サイトのregister_shutdown_functionを使ってエラー処理を行うことにしました。


set_error_handlerのキーワードで検索した時に引っかかってきたのがegister_shutdown_functionだったので、この回答が無ければたどり着けませんでした。
ありがとうございました。

お礼日時:2013/07/09 22:39

いや、ワーニングじゃなくてエラーが出てるのに先に進ませても意味がないです。


しかもparse errorって構文エラーのことですから、プログラムを実行する以前の問題です。
変な横着はしないできちんとエラーが出るたびに該当箇所を修正しましょう。

どうしても先に進みたいのであれば、エラーが出ている部分をコメントアウトするなりスタブを作って回避するなりすればいいですが、修正忘れなどしないように注意が必要です。
    • good
    • 0

致命的なエラーの為、続行させる為には、致命的なエラーが発生しないように


プログラムを直しましょう。
また、警告エラーも、本来出っぱなしになっていても良いものではありませんよ。

この回答への補足

後だしになってしまって申し訳ないのですが、fatal errorの発生する可能性のあるphpファイルが暗号化されているファイルで編集一切不可能なのです。

それを呼び出すのは必須条件のためそれをインクルードする部分もしくはインクルードする処理の関数を呼び出す部分で@もしくはtry等をするしかないと思っていますが、fatalerrorを引き起こした時処理を呼び出し元に戻したいと思っていますが、上手くいきません。

処理自体はファイルを生成するというのが大部分のためerrorになったかどうかはファイルが出来ているかを確認することで何とか出来そうなので、エラーになってもその次に進めたいと考えています。

shell_exec等でphpコマンドから該当ファイルを呼ぶ等も候補に入れています。

何かいい方法は無いでしょうか?

補足日時:2013/04/19 21:20
    • good
    • 2
この回答へのお礼

http://keicode.com/cgi/php-error-handling.php
結局次に進めるのはtrycatchで拾える分のみにして、それ以外は上記サイトのregister_shutdown_functionを使ってエラー処理を行うことにしました。

ありがとうございました。

お礼日時:2013/07/09 22:30

fatal errorの意味を理解されていないのでしょうか?



http://ejje.weblio.jp/content/fatal+error

無視して続行することが不可能なエラーだから止まるのですよ。
    • good
    • 0
この回答へのお礼

後だしになってしまって申し訳ないのですが、fatal errorの発生する可能性のあるphpファイルが暗号化されているファイルで編集一切不可能なのです。

それを呼び出すのは必須条件のためそれをインクルードする部分もしくはインクルードする処理の関数を呼び出す部分で@もしくはtry等をするしかないと思っていますが、fatalerrorを引き起こした時処理を呼び出し元に戻したいと思っていますが、上手くいきません。

処理自体はファイルを生成するというのが大部分のためerrorになったかどうかはファイルが出来ているかを確認することで何とか出来そうなので、エラーになってもその次に進めたいと考えています。

http://keicode.com/cgi/php-error-handling.php
結局次に進めるのはtrycatchで拾える分のみにして、それ以外は上記サイトのregister_shutdown_functionを使ってエラー処理を行うことにしました。

ありがとうございました。

お礼日時:2013/07/09 22:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!