[解決済み】1つのキャッチブロックに複数の例外タイプをキャッチする
質問
次のような機能を取得するための、よりすっきりした方法が欲しいです。
AError
と
BError
を1つのブロックにまとめています。
try
{
/* something */
}
catch( AError, BError $e )
{
handler1( $e )
}
catch( Exception $e )
{
handler2( $e )
}
何か方法はないでしょうか?それとも、別々にキャッチしなければならないのでしょうか?
AError
と
Berror
はベースクラスを共有していますが、他の型とも共有しているので、それを使ってフォールスルーで
handler2
ということで、ベースクラスだけをキャッチすることはできません。
どのように解決するのですか?
アップデートしてください。
PHP 7.1より、ご利用いただけます。
構文は以下の通りです。
try
{
// Some code...
}
catch(AError | BError $e)
{
// Handle exceptions
}
catch(Exception $e)
{
// Handle the general case
}
Docs https://www.php.net/manual/en/language.exceptions.php#example-294
RFC https://wiki.php.net/rfc/multiple-catch
コミット https://github.com/php/php-src/commit/0aed2cc2a440e7be17552cc669d71fdd24d1204a
PHP7.1以前の場合。
他の回答がどうであろうと、あなたは
AError
と
BError
を同じブロックに入れることができます(例外を定義するのがあなたであれば、多少は簡単です)。たとえ、あなたが"fall through"したい例外があるとしても、あなたのニーズにマッチする階層を定義することができるはずです。
abstract class MyExceptions extends Exception {}
abstract class LetterError extends MyExceptions {}
class AError extends LetterError {}
class BError extends LetterError {}
次に
catch(LetterError $e){
//voodoo
}
ご覧のように
ここで
と
こちら
は、さらに
SPL
のデフォルトの例外は、活用できる階層構造を持っています。さらに
PHPマニュアル
:
例外が発生した場合、その文に続くコードは実行されません。 が実行され PHP は、最初にマッチするキャッチブロックを探そうとします。
つまり、以下のようなことも可能です。
class CError extends LetterError {}
とは異なる処理を行う必要があります。
AError
または
BError
ということで、catch文は次のようになります。
catch(CError $e){
//voodoo
}
catch(LetterError $e){
//voodoo
}
もし、同じスーパークラスに属する例外が20個以上あり、そのうちの5個(あるいはそれ以上の大きさのグループ)を一方的に処理し、残りをもう一方に処理する必要があったとしても、これは可能です。
interface Group1 {}
class AError extends LetterError implements Group1 {}
class BError extends LetterError implements Group1 {}
そして
catch (Group1 $e) {}
例外処理に関しては、OOPを使うと非常に強力です。以下のようなものを使用します。
get_class
または
instanceof
はハックされるので、できれば避けたいところです。
もうひとつ付け加えたい解決策は、例外処理機能を独自のメソッドに置くことです。
を持つことができます。
function handleExceptionMethod1(Exception $e)
{
//voodoo
}
function handleExceptionMethod2(Exception $e)
{
//voodoo
}
例外のクラス階層やインターフェイスを制御する方法が全くないと仮定すると、(ほとんど常に 意志 がある)、次のようにすることができます。
try
{
stuff()
}
catch(ExceptionA $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionB $e)
{
$this->handleExceptionMethod1($e);
}
catch(ExceptionC $e)
{
$this->handleExceptionMethod1($e);
}
catch(Exception $e)
{
$this->handleExceptionMethod2($e);
}
この方法では、例外処理のメカニズムを変更する必要がある場合、変更する必要があるのは単一のコードロケーションだけであり、OOPの一般的な構成の中で作業していることになります。
関連
-
[解決済み】PHP - 構文エラー、予期しないT_CONSTANT_ECAPSED_STRING [閉店].
-
[解決済み】mysqli_result クラスのオブジェクトを文字列に変換できない
-
[解決済み】PHP 7.2 - Warning: count(): パラメータは配列かCountableを実装したオブジェクトでなければならない [解決済み]
-
[解決済み] php5パッケージのインストール候補がない (Ubuntu 16.04)
-
[解決済み】メッセージ。Trying to access array offset on value of type null [重複]配列のオフセットにアクセスしようとしています。
-
[解決済み] Forbidden :このサーバーの /phpmyadmin にアクセスする権限がありません。
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] Pythonのwith文の使用中に例外をキャッチする
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Fatal error: メンバ関数bind_param()のbooleanに対する呼び出し [重複] [重複
-
[解決済み】move_uploaded_fileは、「failed to open stream: Permission denied" というエラーが出る
-
[解決済み】変な電話番号を生成するフェイカー?
-
[解決済み] SQLSTATE[HY093]: 無効なパラメータ番号: バインドされた変数の数が102行目のトークンの数と一致しない [終了]
-
[解決済み】「Fatal error: Class 'MySQLi' not found "を解決するには?
-
[解決済み】Laravel 5.2 Storage::makeDirectory($dir) でディレクトリが作成されない。
-
[解決済み】警告。数値でない値に遭遇しました
-
[解決済み】file_get_contents( )が動作しない。
-
[解決済み] [Solved] Fatal error: メンバ関数 query() の null への呼び出し。
-
[解決済み] mysql_field_nameを新しいmysqliに変更します。