AError
と BError
を 1 つのブロックでキャッチする次の機能を取得する、よりクリーンな方法が欲しいです。
これを行う方法はありますか?それとも個別にキャプチャする必要がありますか?
AError
と Berror
には共有基本クラスがありますが、handler2
に分類したい他の型とも共有されているため、基本的な種類をキャプチャするだけではありません。
P粉7774587872023-10-15 15:07:15
これは PHP 7.1 以上で可能です。この 回答 を参照してください。
例外を変更できる場合は、 この回答を使用してください 。
そうでない場合は、Exception
を使用してすべての例外をキャッチしてから、instanceof
を使用してください。
しかし 上の回答で述べたように、複数の catch ブロックを使用する方が良いです .
リーリーP粉6114563092023-10-15 00:46:51
この機能は、PHP 7.1 以降で利用可能です。
構文は次のとおりです:
リーリードキュメント: https://www.php.net/manual/en/ language.Exceptions.php#example-334
#RFC: https://wiki.php.net/rfc/multiple-catch
コミット:https://github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
これらの他の回答が何と言っているかにもかかわらず、同じブロックで AError
と BError
の両方をキャッチできます (例外を定義しているのが自分の場合は簡単です)。 「除外」したい例外がある場合でも、ニーズに合わせて階層を定義できるはずです。
とここからわかるように、SPL デフォルト例外にも悪用される可能性のある階層があります。さらに、PHP マニュアル
: に記載されているように、
これは、
や BError
とは異なる方法で処理する必要があるため、catch ステートメントは次のようになります:
リーリー
同じスーパークラスに正当に属する例外が 20 個以上あり、そのうちの 5 個 (または大きなグループ) を 1 つの方法で処理し、残りを別の方法で処理する必要がある状況があるとします。 、まだできます。
OOP の使用は、例外を処理するときに非常に強力です。
get_classや
instanceof などの使用はハックであるため、可能であれば避けてください。
私が追加したいもう 1 つの解決策は、例外処理機能を独自のメソッドに組み込むことです。
###あなたが持つことができます###
リーリー
例外クラスの階層またはインターフェイスを制御する方法がまったくないと仮定すると (ほとんどの場合、
リーリー
これにより、例外処理メカニズムを変更する必要がある場合でも、変更する必要があるコードの場所は 1 つだけになり、OOP の一般的な構造内で作業することになります。