web-dev-qa-db-ja.com

PHP致命的なエラー:キャッチされていない例外 'Exception'

私は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'をキャッチできませんでした しかし、それは私の問題とはまったく異なり、簡潔な答えはありません。

助けてください?

*編集*

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

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

何故ですか?

**編集2 **

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

10
darksoulsong

これは、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");
22
Orangepill

誰かが私と同じ問題を抱えている場合に備えて、ここに少し情報を追加してください。

コードで名前空間を使用し、例外をスローする関数を持つクラスがありました。

しかし、別のクラスファイルのtry/catchコードは完全に無視され、キャッチされていない例外の通常のPHPエラーがスローされました。

「use\Exception;」を追加するのを忘れていました。上部に追加すると、エラーが解決しました。

9
xorinzor

For

throw new Exception('test exception');

500を取得しました(ただし、ブラウザに何も表示されませんでした)。

php_flag display_errors on

私の.htaccess内(サブフォルダーのみ)。さらに詳細な設定もあります。 htaccessのみを使用したphpでのエラー表示の有効化

0
Eugene Lycenok