めもめも のーと

ハマったこととか、覚えたこととか

例外クラスを外部定義して共通化してみた

Codeignierで開発をしていて、例外処理を書くとき、例外の種類に応じた処理をするために、独自の例外クラスを作りたくなりました。

例)

try{

}catch(UnauthorizedException $e){ //独自

}catch(NotFoundException $e){     //独自

}catch(Exception $e){             //PHPに標準で用意されている例外クラス

}

ところがいい情報が見つからなかったので、「こうしたらできるか?」的なノリで実装したらとりあえず動いたのでメモ。 ※(おかしな記述だったらご指摘いただけるとありがたいです!)


以下の例外クラスをまとめたファイルを追加。
# application/libraries/Api_response.php

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Api_Response extends Exception{
  public function __construct($msg, $code){
    parent::__construct($msg, $code);
  }
}

class UnauthorizedException extends Api_Response{ <= 独自の例外クラスを追加
  public function __construct(){
    parent::__construct("Unauthorized.", 401);
  }
}

class NotFoundException extends Api_Response{
  public function __construct(){
    parent::__construct("Not found.", 404);
  }
}

↑の例外クラスを使うコントローラ
# application/controllers/Account.php

require APPPATH.'libraries/Api_Response.php'; <=追加

throw new UnauthorizedException();  <= 適宜throwして、冒頭の例のようにtry - catchで補足

これでコントローラごとに class NotFoundException を書かずに共通化できました。 この書き方がCodeigniter的によろしいのかどうかは分かりませんが。。。