ちょっと複雑な処理をゴリゴリ書いていると例外が欲しくなってきます。
途中で計算がおかしくなった時に処理を中断させたい時とか。
こういう時は自分でtry-catchを書いてthrow new Exceptionしたりすると処理を中断できて便利。
基本的な例外処理
try { //----なんかの処理A---- if($A === FALSE) { //処理A失敗 throw new Exception(); } //----なんかの処理B---- if($B === FALSE) { //処理B失敗 throw new Exception(); } } catch (Exception $e) { echo '失敗したよおおおおおおお'; }
でも、ここでいくつか問題があることに気づきます。
- なんの処理で失敗したかが分かりにくい
- 処理A失敗時と処理B失敗時のcatch処理を変えられない
これを解消するため、独自に例外(Exception)を作ってあげます。
独自例外の作り方
今回はWebAPIExceptionという名前で作成してみます。
これはWebAPIを使用して正しい値が返ってこなかった時にthrowしてやったりします。
よく僕が使う手法です。
/** * WebAPIとの通信に失敗した場合の例外 * */ class WebAPIException extends Exception { public function __construct(){ parent::__construct('WebAPIの接続に失敗しました。', 800); //これでもOK //$this->code = 800; //$this->message = 'WebAPIの接続に失敗しました。'; } }
Exceptionクラスを継承して、親のコンストラクタに例外メッセージとコードを渡してやります。
クラス名は任意ですが、名前の後ろにExceptionを付けておくのが一般的です。
また、コードも任意ですが、既存のExcepitonコードと被らないようにしてやります。
親のコンストラクタに渡さなくても直接$this->messageや$this->codeに代入しても大丈夫です。
ただ、極力親のコンストラクタを呼んでやる方が安全だと思います。
あとはこいつを
throw new WebAPIException();
してやれば使えます。
Exceptionクラスの関数
try { //例外をスロー throw new WebAPIException(); } catch (WebAPIException $e){ echo $e->getCode()."<br>"; echo $e->getFile()."<br>"; echo $e->getLine()."<br>"; echo $e->getMessage()."<br>"; }
- ●Exception::getCode()
- 設定したコードを返します。
- ●Exception::getFile()
- ファイル名のフルパスを返します。
- ●Exception::getLine()
- 例外の起きた行を返します。
- ●Exception::getMessage()
- 設定した例外メッセージを返します。
ということで例外の作り方、意外と簡単なので使ってみてください!