在控制器中包含自定义异常文件

时间:2013-02-04 19:46:45

标签: php codeigniter

我正在尝试在我的模型和控制器中使用异常。在application目录中,我创建了一个目录Exceptions,在文件'CustomException1.php'和'CustomException2.php'中有一些异常类。

我在MY_Controller

中定义了application/core
class MY_Controller extends CI_Controller {

    public function __construct() {
        parent::__construct();      

        // include Exception files
        require_once(APPPATH . 'Exceptions/CustomException1.php');
        require_once(APPPATH . 'Exceptions/CustomException2.php');
    }

}

在我的控制器Test中:

class Test extends MY_Controller {
   public function index() {
      try {
         throw new CustomException1('This is a custom exception');
      } catch (CustomException1 $e) {
         $this->output->set_status_header('500');
         echo $e->message;
      }
}

现在,我希望这可以工作,因为我需要所有定义Exception类的文件,但我仍然会收到错误说明

Class CustomException1 not found on line xx

2 个答案:

答案 0 :(得分:0)

throw new CustomException1('This is a custom exception');

和     catch(CustomException $ e)

tbh,这更像是一个错字。抛出的异常CustomException1应为CustomException

答案 1 :(得分:0)

无论出于何种原因,包括Exceptions目录中的文件在CI中都不起作用。将它们放在libraries目录中并使用$this->load->library()加载它们也不会有效,因为CI在加载时尝试实例化库,当然,这是我不想要的。

我最终将它们放在exceptions中的helpers目录中,然后使用MY_Controller将其加载到$this->load->helper('Exceptions/CustomException');

重要的是要注意,在帮助程序中加载时,CI会将整个路径转换为小写并将_helper附加到文件名的末尾,因此我的异常类在服务器上的确切路径是

APPPATH . 'helpers/exceptions/customexception_helper.php'

这是我修改过的基类控制器:

class MY_Controller extends CI_Controller {

    public function __construct() {
        parent::__construct();      

        $this->load->helper("Exceptions/CustomException1.php");
        // includes file APPPATH . 'helpers/exceptions/customexception1_helper.php'

        $this->load->helper("Exceptions/CustomException2.php");
        // includes file APPPATH . 'helpers/exceptions/customexception2_helper.php'
    }
}

一旦使用MY_Controller以这种方式包含,这些例外就可以在模型中使用,而无需在MY_Model中重新加载它们。

PS - 我对这个解决方案并不完全满意,而且看起来有点黑客,但这可能是将异常集成到CodeIgniter中的唯一方法。