2013-04-08 17 views
22

私のクラスのユーザーが私が意図していなかったことを悪用したときに、PHPクラスに致命的な、捕捉不能なエラーを投げられるようにしたいと思います。私は彼/彼女がキャッチ条項で回復できるようにしたくありません。 私はtrigger_errorについて知っていますが、警告または通知のみを出すことができます。PHP:トリガ致命的なエラー?

+1

なぜ迷惑ですか?あなたのクラスを実装している人は誰ですか:1.プログラマーです。 2.ソースにアクセスできます。 3. 'trigger_error()'呼び出しを削除することができます。 – Sammitch

+1

@Sammitch:私は私の意図を明確にしたい。私は自分のコードを使っている人に、自分がやっていることは、どうやってそれを使うことを意図しているのか分からないようにしたいと思っています。例外を投げる私には、「この未定義の振る舞いを扱う」というメッセージが送信されます。私はメッセージを送信したい:「そうしないで、代わりにこのようにしてください」 – DudeOnRock

+2

サンプルライブラリ。たとえば、条件が真でない場合は、絶対に何かをしないでください。 (文書を読むのが好きでない人には役に立ちます:P) – bwoebi

答えて

39

E_USER_ERRORは、適切な定数です。

trigger_error("Fatal error", E_USER_ERROR); 

マニュアルページの最初の例も参照してください。

+6

「文書を読むのが好きではない人にとって便利な」と言った男は、マニュアルページの最初の例です。 –

5
debug_print_backtrace(); 
trigger_error("As much information as you can provide, please", E_USER_ERROR); 
exit(); 

exit()は、PHPスクリプトを完全に終了します。より多くの情報をユーザーまたは開発者にエラーについて提供することができます。エラーコードはpasséです。

編集:E_USER_ERRORを使用すると、スクリプトを終了する必要があります。したがって、trigger_error()の前にdebug_print_backtrace()を移動してください。

+0

絶対に、ダイを追加してください。または出口。このようなエラーをスローした後のコマンドは、ほぼ100%確実である唯一の方法です。それから逃げる唯一の方法(php.iniの無効化された関数を期待する)は[runkit_function_remove](http://php.net/manual/en/function.runkit-function-remove.php) –

8

注:カスタムエラーハンドラを使用している場合は、エラーハンドラはfalseを返していない限り死ぬ/ E_USER_ERRORは/終了を停止しません(set_error_handler参照)

一言で言えば:E_USER_ERRORが扱われている場合、カスタムエラーハンドラを効果的に判断し致命的なものとして

+2

です。別の場所に書いたように、致命的なエラーが発生する可能性があります。 if($ isTestMode == 1){ eval( "noSuchFunction();"); } このメソッドは常に動作します。 –

+0

これは本当に私を助けてくれたブラッドさん、私はカスタムエラーハンドラ機能を使用しています。 「エラーを処理していましたが」フラグE_USER_ERRORでトリガしましたが、エラーハンドラ関数からfalseを返すまで「致命的な」エラーが発生していませんでした。 – dading84

関連する問題