Kohana中的自定义异常处理3

时间:2011-07-26 14:14:31

标签: kohana kohana-3

我需要为我的app / module生成的异常创建自定义异常。

  • 我想在一个地方合并所有异常类,并在一个地方处理异常。
  • 我可能有一般的例外情况,如下所述,我希望在一个常见的地方
    • 输入无效
    • 内部错误(数据库错误,smtp错误,其他失败)
    • 许可被拒绝
    • 会话错误
  • 我可能有特定的例外,如下所述

    • 电子邮件无效等
  • 特殊例外可能是通用例外的子类,例如“电子邮件无效”可能属于“输入无效”例外。

  • 我应该能够在投掷时发送数据和异常消息。 (如果可行,数据将在数组或对象中)

最好的办法是什么? 组织自定义例外的最佳方法是什么? 如何以这样的方式编写代码,使我们不必在每个地方捕获常见异常,但同时用户会收到有意义的错误。
在调用方法之后,我们应该只捕获该方法可以抛出的特定异常。

1 个答案:

答案 0 :(得分:11)

我建议你转到Kohana 3.2,因为Kohana在新的稳定版本中处理异常的方式发生了变化。假设您要使用v3.2,这就是管理自定义异常的方法:

首先,您需要修改bootstrap.php并确保Kohana :: init()调用中的'errors'为true。这将确保Koahana将处理您或系统抛出的所有未处理的异常。如果你检查\ classes \ kohana \ core.php,Kohana使用下面的php调用注册它的异常处理程序类Kohana_Exception

set_exception_handler(array('Kohana_Exception', 'handler'));

默认异常处理程序可以很好地处理所有类型的异常并将消息写入日志文件夹并显示基本错误页面。如果您查看Kohana_Exception,它是Kohana_Kohana_Exception类的子类,这是编写逻辑的地方。

现在,要自定义内容:

  • 如果您正在寻找仅显示自定义页面以显示错误,请创建一个名为application / views / kohana / error.php的视图,并将您的自定义错误页面放在那里。它将覆盖在system / views / kohana / error.php中找到的系统默认错误视图文件。

  • 如果您正在寻找更改记录错误的方式或根据特定类型的错误进行一些自定义处理,您需要覆盖Kohana_Exception类或通过调用set_exception_handler()来注册您自己的派生异常处理程序bootstrap.php的结尾。

    • 要覆盖Kohana_Exception,只需将paste /system/classes/kohana/exception.php复制到application / classes / kohana / exception.php并覆盖handler()和/或text()方法。例如下面我自定义处理404错误,还包括user_id到错误日志进行调试。

class Kohana_Exception extends Kohana_Kohana_Exception 
{
    /**
     * Overriden to show custom page for 404 errors
     */
    public static function handler(Exception $e)
    {
        switch (get_class($e))
        {
            case 'HTTP_Exception_404':
                $response = new Response;
                $response->status(404);
                $view = new View('error/report_404');
                $view->message = $e->getMessage();
                echo $response->body($view)->send_headers()->body();
                if (is_object(Kohana::$log))
                {
                    // Add this exception to the log
                    Kohana::$log->add(Log::ERROR, $e);
                    // Make sure the logs are written
                    Kohana::$log->write();
                }                
                return TRUE;
                break;

            default:
                return Kohana_Kohana_Exception::handler($e);
                break;
        }
    }

  /**
    * Override if necessary.  E.g. below include logged in user's info in the log
   */
   public static function text(Exception $e)
   {

    $id = <get user id from session>;
    return sprintf('[user: %s] %s [ %s ]: %s ~ %s [ %d ]',
            $id, get_class($e), $e->getCode(), strip_tags($e->getMessage()), Debug::path($e->getFile()), $e->getLine());        

   }
}

有用的外部链接和参考:

http://kohana.sebicas.com/index.php/guide/kohana/errors

http://kohanaframework.org/3.1/guide/kohana/tutorials/error-pages