Kohana中的自定义异常处理3

Shr*_*ath 4 kohana kohana-3

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

  • 我想在一个地方合并所有异常类,并在一个地方处理异常.
  • 我可能有一般的例外,如下所述,我想在一个常见的地方
    • 输入无效
    • 内部错误(数据库错误,smtp错误,其他失败)
    • 没有权限
    • 会话错误
  • 我可能有特定的例外,如下所述

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

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

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

Mur*_*esh 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'));
Run Code Online (Sandbox Code Playgroud)

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

现在,要定制东西:

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

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

    • 要覆盖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());        

   }
}
Run Code Online (Sandbox Code Playgroud)

有用的外部链接和参考:

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

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

  • 尝试Kohana 3.3并注意到一些事情.我可以通过将Kohana_Exception复制到application/classes/Kohana/Exception.php并覆盖handler()和/或text()方法来覆盖它.但我无法通过将其复制到modules/my_module/classes/Kohana/Exception.php来覆盖.我相信它应该有效,因为Kohana将它们级联起来. (2认同)
  • @Varun:覆盖模块中的Exception类不起作用,因为Exception类是在Kohana_Core :: init中自动加载的.这在加载任何模块之前发生. (2认同)