例外処理のcatch()の()の部分はどのような意味なのでしょうか?
例えば、
PHP
1try{ 2 $obj = new SplFileObject($file, "rb"); 3}catch(Exception $e){ 4 echo $e->getMessage(); 5 exit(); 6}
catch(Exception $e)の部分の「Exception」は定義済みのクラスのことですよね?
$eはExceptionクラスのインスタンス(オブジェクト)という意味でしょうか?
$e->getMessage() はインスタンスである$eのgetMessagemeメソッドを使用しているということですよね?
$e = new Exception();
catchの()はこのような意味なのでしょうか?
初歩的なことですみませんが、ご回答いただきたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
ベストアンサー
catchブロックは、tryブロック内でException(例外)が発生した場合に、Exception の種類ごとに、それを受け取って処理を行います。
例えば
PHP
1try{ 2 3 //throw new ErrorException("error"); // 1 4 //throw new InvalidArgumentException("invalid argument"); // 2 5 //throw new Exception("general"); // 3 6 //throw new PDOException("pdo"); // 4 7 8} catch(ErrorException $e){ 9 echo $e->getMessage(); 10 exit(); 11} catch(InvalidArgumentException $e){ 12 echo $e->getMessage(); 13 exit(); 14} catch(Exception $e){ 15 echo $e->getMessage(); 16 exit(); 17}
のようなコードがあるとして、
1をコメントアウトして活かし、ErrorExceptionをthrowすると1番目のcatchブロックでそれがキャッチされ、$eとして先程 new したErrorException(例外)のインスタンスが引数として渡されます。
ですから、
PHP
1echo $e->getMessage();
の部分で、errorという文字が表示されます。
2を活かすとInvalidArgumentExceptionがthrowされるので2番目のcatchブロックでキャッチされて、invalid argument が表示されます。
3も同様で3番目のcatchブロックでキャッチされ general が表示されます。
4をコメントアウトすると new された PDOException のインスタンスが throw されますが、これ用の catch ブロックが存在しません。
ですが、PDOException は RuntimeException クラスを継承し、さらに RuntimeException クラスは Exception クラスを継承しているため、結果的に 3番目の catch ブロックでキャッチされ、やはり、pdo が表示されます。
このように、catch ブロックは try ブロック内で throw された Exception 毎にキャッチを行い、その際に new されたインスタンスを引数として取ります。
ですから、不正な実行結果の際に Exception(例外)を throw する関数等を try ブロック内に書いた場合、エラー処理が非常に簡単に行えるようになるわけです。
尚、全ての例外の基底クラス Exception クラスでは
http://php.net/manual/ja/class.exception.php
PHP
1/* プロパティ */ 2protected string $message ; 3protected int $code ; 4protected string $file ; 5protected int $line ;
となっていて、そのコンストラクタは
http://php.net/manual/ja/exception.construct.php
なため、
PHP
1$e = new SomeException("hogehage");
のように new すると、第一引数の文字列が、そのインスタンスに対する
PHP
1$e->getMessage();
という getMessage() メンバメソッドで取得できるというわけです。
投稿2017/09/01 15:28
編集2017/09/01 15:44
退会済みユーザー
総合スコア0
0
catch(Exception $e)の部分の「Exception」は定義済みのクラスのことですよね?
$eはExceptionクラスのインスタンス(オブジェクト)という意味でしょうか?
PHP内部の定義済みのクラスのことで、定義済みの例外は他にもあります。PHP7ではError $e
というのもあります。
もともと、PHPには「try~catch 例外処理」はありませんでした。
導入された際に例外の$e
だけ特殊な扱いで型宣言
しなくてはならない仕様で導入されました。
これがException $e
です。
普通、オブジェクト指向言語では変数の型宣言
をしなくてはなりません。ストリング(オブジェクト)型の変数$strの場合は、String $str
という具合です。PHPは型を自動判断しましょうというコンセプトなので通常は型を書かず、例外の時だけException $e
と書かなければいけません。
PHPマニュアルの型宣言について(タイプヒンティング)に型宣言できる型一覧が記載されてます。
例えばArray $array
などというように型を定義して変数宣言できます。こうすることで、配列以外の型を代入することはできなくなり、より厳密にプログラムを作成することができるようになります。
php
1// 型宣言(タイプヒンティング) 2function something (array $param = array()) { 3 ... 4}; 5 6something(array(1,2,3)); // OK 7something(1) // NG
$e->getMessage() はインスタンスである$eのgetMessagemeメソッドを使用しているということですよね?
$e = new Exception();
正確にはtry{throw new \Exception();}catch(\Exception $e){}
ですが、感覚的にはあってます。
投稿2017/09/01 15:28
編集2017/09/01 18:49総合スコア1652
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2017/09/03 09:45 編集

退会済みユーザー
2017/09/03 10:41

0
https://github.com/php/php-src/blob/master/Zend/zend_exceptions.c
C
1/* {{{ proto Exception|Error::__construct(string message, int code [, Throwable previous]) 2 Exception constructor */ 3ZEND_METHOD(exception, __construct) 4{ 5 zend_string *message = NULL; 6 zend_long code = 0; 7 zval tmp, *object, *previous = NULL; 8 zend_class_entry *base_ce; 9 int argc = ZEND_NUM_ARGS(); 10 11 object = getThis(); 12 base_ce = i_get_exception_base(object); 13 14 if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc, "|SlO!", &message, &code, &previous, zend_ce_throwable) == FAILURE) { 15 zend_class_entry *ce; 16 17 if (Z_TYPE(EX(This)) == IS_OBJECT) { 18 ce = Z_OBJCE(EX(This)); 19 } else if (Z_CE(EX(This))) { 20 ce = Z_CE(EX(This)); 21 } else { 22 ce = base_ce; 23 } 24 zend_throw_error(NULL, "Wrong parameters for %s([string $message [, long $code [, Throwable $previous = NULL]]])", ZSTR_VAL(ce->name)); 25 return; 26 } 27 28 if (message) { 29 ZVAL_STR(&tmp, message); 30 zend_update_property_ex(base_ce, object, ZSTR_KNOWN(ZEND_STR_MESSAGE), &tmp); 31 } 32 33 if (code) { 34 ZVAL_LONG(&tmp, code); 35 zend_update_property_ex(base_ce, object, ZSTR_KNOWN(ZEND_STR_CODE), &tmp); 36 } 37 38 if (previous) { 39 zend_update_property_ex(base_ce, object, ZSTR_KNOWN(ZEND_STR_PREVIOUS), previous); 40 } 41} 42/* }}} */ 43
投稿2017/09/03 09:03

退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/01 16:03
2017/09/01 16:24
退会済みユーザー
2017/09/02 00:03
2017/09/02 10:52
2017/09/02 11:02
退会済みユーザー
2017/09/02 12:12 編集
退会済みユーザー
2017/09/02 12:11 編集
退会済みユーザー
2017/09/02 12:03 編集
2017/09/03 05:42
退会済みユーザー
2017/09/03 09:25 編集
退会済みユーザー
2017/09/03 09:02
退会済みユーザー
2017/09/03 09:28
2017/09/03 11:24
2017/09/04 15:42