1. ホーム
  2. php

[解決済み] 警告をtry/catchすることはできますか?

2022-03-24 17:46:49

質問

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つの可能性は、呼び出しの前に独自のエラーハンドラを設定し、後で以前のエラーハンドラを復元するために 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) {
    // ...
}

独自のエラーハンドラを使用する際に注意すべき点は、このエラーハンドラは error_reporting を設定し、すべてのエラー (通知、警告など) をあなたのエラーハンドラに渡します。に第二引数を設定することができます。 set_error_handler() を使用して、受け取りたいエラーの種類を定義するか、 現在の設定にアクセスします。 ... = error_reporting() をエラーハンドラ内で使用します。

警告の抑制

もう一つの可能性は、@ 演算子による呼び出しを抑制して dns_get_record() を後から追加することができます。 しかし、私はこれに対して忠告します。 エラーや警告は処理するために発生するのであって、抑制するために発生するのではありませんから。