2011-12-22 8 views
4

PHPの "include"関数の最後のエラーをキャプチャする必要があります。関数のエラーを "include" PHPで取り込む方法は?

私は関数 "Exceptions"でテストしますが、残念ながら関数 "include"の上に書いています。

"include"関数の後に書き込むと例外が表示されません。

例1:

try{ 
     throw new exception(); 
     require_once($this->controller['path']); 
    } 
    catch(exception $e) 
    { 
     print_r(error_get_last()); 
    } 

このリターン: ...(ボイド)...

例2:

try{ 

     require_once($this->controller['path']) OR throw new exception();; 
    } 
    catch(exception $e) 
    { 
     print_r(error_get_last()); 
    } 

この戻り:解析エラー:構文エラー、予期しないT_THROW ...

私は意図的にインクルードするファイルに構文エラーを作成しました。考え方は、エラーをトラップしてデバッグできるようにすることです。

これを取得する方法はありますか?

みんな!構文エラーを検出する必要があります。ご挨拶!

+0

みんな!構文エラーを検出する必要があります。 よろしくお願いいたします。 –

+2

@OlaErlandsenTriskel:できません。構文エラーはトークン化レベルで失敗します。あなたのコードはそれまでに実行を開始していません。ファイルをインクルードし、個々のファイルに 'token_get_all()'を実行することができます。解析エラーがあった場合(空の配列かもしれない)に何が起こるかわからない? – alex

+0

なぜ構文エラーをテストしたいですか?実行時ではなく開発時に行う必要があります –

答えて

6

まず、requireを使用すると、ファイルを含めることができない場合は常にアプリが強制終了されます。結果をコントロールすることはできません。その後は何もできません。ファイルインクルージョンの成功をコントロールしたい場合は、includeを使用して戻り値をテストします。

$success = include "foo.php"; 
if (!$success) { 
    // the file could not be included, oh noes! 
} 

あなたはそのように構文の違いを持つことができます。ファイルはあなたがキャッチすることができない、含めることができない場合

if (!(include "foo.php")) ... 

このE_NOTICEをトリガします。しかし、それは問題をデバッグするのに役立ち、とにかくエラーが表示されるようになります(右、?)。

or throw new Exceptionthrowは式であり、式が期待される場所では使用できないため、機能しません。


あなたはで構文エラーをキャッチしたい場合はファイル、php_check_syntaxを使用/それは後継php -l <file>ですが含まれています。

+0

これに "構文エラー"が含まれていると、この動作に失敗します。S –

+0

インクルードファイルに構文エラーがありませんか?これはおそらくあなたの質問ですか? – deceze

+0

私は意図的にインクルードするファイルに構文エラーを作成しました。考え方は、エラーをトラップしてデバッグできるようにすることです。 –

4

require_onceは、言語構造であり、関数ではないため、短絡することはできません。

ファイルを含める前にファイルが存在するかどうかをテストするには、is_file()を使用できます。ファイルが読み取り可能かどうかをテストする場合は、is_readable()を使用できます。

includeを使用して、ファイルが見つからない場合は、E_COMPILE_ERRORではなく、E_WARNINGを発行することもできます。私はアレックスに同意

+0

彼はファイルが存在するかどうかテストしたくないと思いますが、ファイルが読み込み可能な場合は... * –

+0

@ Col.Shrapnel:更新された回答、ありがとうございます。 – alex

+0

笑、それは幾分面白いものになった。 *は*読み込みを意味するので、 "ファイルが読み込み可能かどうかをテストするにはis_file()を使うことができます。ファイルが読み込み可能かどうかをテストする場合は、is_readable()を使用できます。 :) –

1

は、file_exists()は例外

if(file_exists($this->controller['path'])){ 
    try{ 
     require_once($this->controller['path']); 
    }catch(Exception $e){ 
      // throw error 
    } 
} 

を使用するか、

if(is_readable($this->controller['path'])){ 
    try{ 
     require_once($this->controller['path']); 
    }catch(Exception $e){ 
      // throw error 
    } 
} 
0

ほとんどのネイティブPHP関数はエラーではなく、例外をスローをトリガー)(is_readable使用のチェックとカテーテル検査エラーにしてみてください。あなたは例外として、すべての非致命的なエラーをキャッチすることができるでしょう。このコードで

function exceptions_error_handler($severity, $message, $filename, $lineno) { 
    throw new ErrorException($message, 0, $severity, $filename, $lineno); 
} 
set_error_handler('exceptions_error_handler'); 

:例外にPHPのエラーを変換するには、カスタムエラーハンドラを設定することができます。 require_*関数は致命的なエラーをスローするので、代わりにincludeを使用しなければならないことに注意してください。

コード自体の中で構文エラーを処理することについては、少し考えてみるのは非常に不可能です。

+0

私はそれを使用しましたが、クラスから "include"という関数を呼び出しています... –

+2

だから何ですか?それはどこからでも動作します。 –

関連する問題