警告をキャッチできますか? 質問する

警告をキャッチできますか? 質問する

いくつかの 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、ホスト名のレコードが見つかりません。

ここでのベストプラクティスは何でしょうか?

ベストアンサー1

エラーハンドラの設定と復元

1 つの可能性としては、呼び出し前に独自のエラー ハンドラーを設定し、後で を使用して以前のエラー ハンドラーを復元することが挙げられますrestore_error_handler()

set_error_handler(function() { /* ignore errors */ });
dns_get_record();
restore_error_handler();

このアイデアを基に、エラーをログに記録する再利用可能なエラー ハンドラーを作成することもできます。

set_error_handler([$logger, 'onSilencedError']);
dns_get_record();
restore_error_handler();

エラーを例外に変える

set_error_handler()クラスを使用して、ErrorExceptionすべての PHP エラーを例外に変換できます。

set_error_handler(function($errno, $errstr, $errfile, $errline) {
    // error was suppressed with the @-operator
    if (0 === error_reporting()) {
        return false;
    }
    
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

try {
    dns_get_record();
} catch (ErrorException $e) {
    // ...
}

独自のエラー ハンドラーを使用する場合に留意すべき重要な点は、設定をバイパスしてすべてのエラー (通知、警告など) をエラー ハンドラーに渡すことです。2 番目の引数を設定して、受信するエラーの種類を定義したり、エラー ハンドラー内で現在の設定にアクセスしたりerror_reportingできます。set_error_handler()... = error_reporting()

警告を抑制する

もう 1 つの可能性は、@ 演算子を使用して呼び出しを抑制し、dns_get_record()その後の戻り値を確認することです。ただし、エラー/警告は抑制されるのではなく、処理されるためにトリガーされるため、この方法はお勧めしません。

おすすめ記事