🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### 抛出异常 > Lying能捕获全局的错误/异常,如果你的代码抛出了异常并且没有手动捕获,Lying将会捕获它们并且做相应处理。 在程序中手动抛出异常: ~~~php throw new \lying\exception\HttpException('我的异常', 400); //httpCode被设置为400 throw new \Exception('我的异常'); //httpCode被设置为500 ~~~ * 如果抛出的异常类继承自`\lying\exception\HttpException`,那么http返回码会被设置成异常的错误码; * 如果抛出的异常类不是继承自`\lying\exception\HttpException`,那么http返回码会被设置成`500`; ### 默认异常处理 当你没有手动注册异常处理程序时,默认会这样处理: * debug配置为true时,显示 ![exception](https://box.kancloud.cn/de7688d922728a10908405ee7b49f212_685x246.png) * debug配置为false时,只显示`An internal server error occurred.` ### 自定义异常处理 > Lying的异常/错误其实是一个全局事件,你完全可以注册事件来替代Lying默认的错误处理 事件处理程序接受一个时间参数`$event`,是`lying\event\ExceptionEvent`的实例,所以可以这样来获取异常: ~~~php function handle($event) { $exception = $event->e; } ~~~ #### 在配置文件注册错误处理 ~~~php //全局事件 'hook' => [ 'events' => [ ['frameworkError', function ($event) { //这里设置你的错误处理程序,例如: Lying::$maker->dispatch->run('error/error/handle', ['event'=>$event]); //执行error模块,ErrorCtrl控制器,handle方法 return false; //返回false之后,队列后面的事件就不再处理 }], //注册自定义全局错误处理 ], ], ~~~ 或者这样 ~~~php 'hook' => [ 'events' => [ ['frameworkError', ['ErrorHandle', 'run']], //注册自定义全局错误处理,执行`ErrorHandle`类的静态方法`run` ], ], ~~~ > 配置文件注册的错误处理事件是全局的 #### 在程序中注册错误处理 假设某个控制器需要特殊的错误处理,那么除了注册全局错误处理,也可以这样: ~~~php <?php namespace module\index\controller; use lying\service\Controller; /** * Class IndexCtrl * @package module\index\controller */ class IndexCtrl extends Controller { public function init() { parent::init(); \Lying::$maker->hook->on(\Lying::EVENT_FRAMEWORK_ERROR, function ($event) { $exception = $event->e; //获取抛出的异常 \Lying::$maker->response()->setContent('出错了')->send(); //显示错误信息 return false; //事件队列后面的事件不再执行 }, null, false); //注册到事件队列最前面 } /** * 首页 * @return string */ public function index() { return $this->render(); } } ~~~