エラー - php warning catch




私は警告をキャッチすることはできますか? (7)

dns_get_record()が失敗した場合はFALSEを返すので、 @で警告を抑制してから戻り値を確認できます。

私はいくつかのPHPのネイティブ関数からスローされているいくつかの警告をキャッチし、それらを処理する必要があります。

具体的には:

array dns_get_record  ( string $hostname  [, int $type= DNS_ANY  [, array &$authns  [, array &$addtl  ]]] )

DNSクエリが失敗したときに警告が表示されます。

try / catchは警告が例外ではないため動作しません。

私は今2つの選択肢があります:

  1. set_error_handlerは、ページ内のすべての警告をフィルタリングするために使用する必要があるため、過剰なようです(これは本当ですか?

  2. これらの警告が画面にエコーされないようにエラー報告/表示を調整し、戻り値を確認します。 false場合、hostnameのレコードは見つかりません。

ここでベストプラクティスは何ですか?


@演算子には注意してください 。致命的なエラーも抑制する警告を抑制します。 誰かが@mysql_query( '...' )を書いたシステムで問題をデバッグするのに多くの時間を費やしました@mysql_query( '...' )問題はmysqlサポートがPHPに読み込まれず、致命的な致命的なエラーを投げたことです。 PHPコアの一部であるものは安全ですが、注意して使用してください

[email protected]:~$ php -a
Interactive shell

php > echo @something(); // this will just silently die...

これ以上の出力はありません - これをデバッグするのは幸運です!

[email protected]:~$ php -a
Interactive shell

php > echo something(); // lets try it again but don't suppress the error
PHP Fatal error:  Call to undefined function something() in php shell code on line 1
PHP Stack trace:
PHP   1. {main}() php shell code:0
[email protected]:~$ 

今回はなぜ失敗したのか分かります。


おそらく、警告を完全に取り除こうとするべきですが、それが不可能な場合は、@(つまり@dns_get_record(...))を呼び出してから、警告が発生した場合には、か否か。


それが何らかのブール値を返すかどうかを調べてみてください。単純に条件として置くことができます。 私はoci_execute(...)を使ってこれに遭遇しました。これは私のユニークなキーで違反を返していました。

ex.
oci_parse($res, "[oracle pl/sql]");
if(oci_execute){
...do something
}

実際に動作する解決策は、 E_WARNINGパラメータを使用して単純なエラーハンドラを設定することです。

set_error_handler("warning_handler", E_WARNING);
dns_get_record(...)
restore_error_handler();

function warning_handler($errno, $errstr) { 
// do something
}

直進操作(例えば、$ prop = @($ high /($ width - $ depth));ゼロ除算を省略するための警告)を抑制するために@を使用することを推奨します。 しかし、ほとんどの場合、処理する方が良いです。


通常は、これが唯一の解決策でない限り、@は使用しないでください。 その特定のケースでは、レコードが存在するかどうかを知るには、関数dns_check_recordを最初に使用する必要があります。







error-handling