11

PHPで例外をいじっています。たとえば、$_GET 要求を読み取り、ファイルをロードするスクリプトがあります。ファイルが存在しない場合は、新しい例外がスローされます。

if ( file_exists( $_SERVER['DOCUMENT_ROOT'] .'/'.$_GET['image'] ) ) {
    // Something real amazing happens here.
}
else {
    throw new Exception("The requested file does not exists.");
}

問題は、テスト用に存在しないファイルを提供しようとすると、例外メッセージではなく 500 エラーが発生することです。サーバーログは次のとおりです。

[09-Jul-2013 18:26:16 UTC] PHP Fatal error:  Uncaught exception 'Exception' with message 'The requested file does not exists.' in C:\sites\wonderfulproject\script.php:40
Stack trace:
#0 {main}
  thrown in C:\sites\wonderfulproject\script.php on line 40

ここで本当に明らかな何かが欠けているのではないかと思います。

私はこの質問を確認しましたPHP 致命的なエラー: キャッチされていない例外 'Exception' with message ですが、それは私の問題とはまったく異なり、簡潔な答えがありません。

助けてください?

* 編集 *

これはthrowキーワードに関連するもののようです。たとえばecho、次のようにメッセージを画面に出力しました。

「ファイルが存在しません」というメッセージの例外「例外」。C:\sites\wonderfulproject\script.php:183 スタック トレース: #0 {main}

何故ですか?

** 編集 2 **

@Orangepill のおかげで、例外の処理方法について理解が深まりました。そして、私は nettuts から素晴らしい tut を見つけました。リンク: http://net.tutsplus.com/tutorials/php/the-ins-and-outs-of-php-exceptions/

4

3 に答える 3

22

これは、display_errors がオフの場合にキャッチされない例外の予想される動作です。

ここでのオプションは、php または ini ファイルで display_errors をオンにするか、例外をキャッチして出力することです。

 ini_set("display_errors", 1);

また

 try{
     // code that may throw an exception
 } catch(Exception $e){
     echo $e->getMessage();
 }

例外をスローする場合、その意図は、どこかで何かがそれをキャッチして処理することです。そうでない場合は、サーバー エラー (500) です。

もう 1 つのオプションは、set_exception_handlerを使用して、スクリプトの既定のエラー ハンドラーを設定することです。

 function default_exception_handler(Exception $e){
          // show something to the user letting them know we fell down
          echo "<h2>Something Bad Happened</h2>";
          echo "<p>We fill find the person responsible and have them shot</p>";
          // do some logging for the exception and call the kill_programmer function.
 }
 set_exception_handler("default_exception_handler");
于 2013-07-09T18:54:03.260 に答える