質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

3回答

7365閲覧

[PHP] バラバラなクラスの例外をまとめて受けたい

maisumakun

総合スコア145184

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

2グッド

4クリップ

投稿2015/11/25 04:27

PHPの5系列も進んできて、例外を使ってエラーハンドリングがすっきりとするライブラリも増えてきました。

ただ、書いていたコードの中で、どう書けば綺麗になるかわからない部分が出てきてしまいました。

呼びだそうとしたメソッドが投げうる例外が複数種類あるのですが、全部同じ処理をしたいと考えています。ただし、例外ごとに基底クラスがバラバラなので、まとめて中間の例外クラスで受けることもできません。

とりあえず、

  • 1つ1つcatchブロックを書く
  • いったんExceptionで受けて、関係ない例外なら再スローする

というようにして実装自体はできるのですが、もう少しすっきり書く方法はないものでしょうか。

なお、PHP 5.4で動くことを前提としたいですが、もっと上のバージョンでしか使えないような機能でも情報提供は歓迎します。

arly_times, msvsidvfo👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

今すぐは使えないのですが、PHP 7.1にはまさに求めていた機能が実装されることになったので、それを記念してクローズしておきます。

投稿2016/06/13 12:28

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下のようなヘルパーメソッド(?)を使う、などいかがでしょうか?

PHP5.6以上なら、可変長引数リストで実装できそうです。
http://php.net/manual/ja/functions.arguments.php#functions.variable-arg-list

php

1function instanceOneOfThem() { 2 $parameters = func_get_args(); 3 if (sizeof($parameters) <= 1) { 4 throw new RangeException('Too few arguments.'); 5 } 6 7 $object = array_shift($parameters); 8 foreach ($parameters as $type) { 9 if ($object instanceof $type) { 10 return true; 11 } 12 } 13 14 return false; 15}

使用例

php

1error_reporting(E_ALL); 2 3try { 4 5 throw new PDOException(); 6// throw new RuntimeException(); 7// throw new InvalidArgumentException(); 8// throw new Exception(); 9 10} catch (Exception $e) { 11 12 if (instanceOneOfThem($e, 'PDOException', 'RuntimeException')) { 13 print 'Is instance!'; 14 } else { 15 print 'Is not instance..'; 16 } 17 18} 19 20function instanceOneOfThem() { 21 $parameters = func_get_args(); 22 if (sizeof($parameters) <= 1) { 23 throw new RangeException('Too few arguments.'); 24 } 25 26 $object = array_shift($parameters); 27 foreach ($parameters as $type) { 28 if ($object instanceof $type) { 29 return true; 30 } 31 } 32 33 return false; 34}

投稿2015/11/26 09:07

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

どの例外も、Exceptionの拡張で定義してますよね?
こんな感じで。

php

1class ExampleException extends \Exception 2{ 3}

であれば、すべての例外拡張クラスは、

php

1try { 2} catch (\Exception $e) { 3}

でキャッチできます。

投稿2015/11/25 19:22

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問