我需要为我的app / module生成的异常创建自定义异常。
我可能有特定的例外,如下所述
特殊例外可能是通用例外的子类,例如“电子邮件无效”可能属于“输入无效”例外。
我应该能够在投掷时发送数据和异常消息。 (如果可行,数据将在数组或对象中)
最好的办法是什么?
组织自定义例外的最佳方法是什么?
如何以这样的方式编写代码,使我们不必在每个地方捕获常见异常,但同时用户会收到有意义的错误。
在调用方法之后,我们应该只捕获该方法可以抛出的特定异常。
答案 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的结尾。
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