[解決済み] 警告をtry/catchすることはできますか?
質問
php のネイティブ関数から投げられる警告をキャッチして、 それを処理する必要があります。
具体的には
array dns_get_record ( string $hostname [, int $type= DNS_ANY [, array &$authns [, array &$addtl ]]] )
DNSクエリに失敗したときに警告を投げます。
try
/
catch
は、警告は例外ではないので、動作しません。
今、2つの選択肢があります。
-
set_error_handler
は、ページ内のすべての警告をフィルタリングするために使用しなければならないので、やりすぎのように思えます(これは本当でしょうか)。 -
これらの警告が画面にエコーされないように、エラー報告/表示を調整し、次に戻り値をチェックします。
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()
を後から追加することができます。
しかし、私はこれに対して忠告します。
エラーや警告は処理するために発生するのであって、抑制するために発生するのではありませんから。
関連
-
[解決済み】予期せぬ例外。SQLSTATE[HY000] [1045] Access denied for user ****@'localhost' (using password: YES)
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] 検索」からすべての「permission denied」メッセージを除外するにはどうすればよいですか?
-
[解決済み] 複数のJava例外を同じcatch節でキャッチすることはできますか?
-
[解決済み] PHPで有用なエラーメッセージを得るにはどうしたらよいですか?
-
[解決済み] BashでTRY CATCHコマンドはありますか?
-
[解決済み] なぜすべてのブロックを "try"-"catch "で包んではいけないのですか?
-
[解決済み】プログラムを停止/終了させることなく、完全な例外トレースバックをキャッチして表示する方法は?
-
[解決済み】C#で例外をキャッチして再スローする理由とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】PHP - 構文エラー、予期しないT_CONSTANT_ECAPSED_STRING [閉店].
-
[解決済み】空の配列要素を削除する
-
[解決済み】メンバ関数をnullで呼び出す?
-
[解決済み】Phpのincludeが機能しない? 関数がincludeされない
-
[解決済み】「Fatal error: Class 'MySQLi' not found "を解決するには?
-
[解決済み】Wordpressの子テーマのstyle.cssが効かない。
-
[解決済み】mysqli::query(): mysqli をフェッチできない
-
[解決済み] SSLエラー SSL3_GET_SERVER_CERTIFICATE:証明書の検証に失敗しました。
-
[解決済み] PHP 未定義関数への呼び出し
-
[解決済み] libapache2-mod-php7 パッケージの場所がわからない