CakePHP中的错误处理程序和ErrorHandlerMiddleware之间有什么区别?
我知道这些问题不受欢迎,但我试图在CakePHP上提问,但没有得到回应。我想把CakePHP中的错误处理程序和ErrorHandlerMiddleware之间有什么区别?,php,cakephp,cakephp-3.0,Php,Cakephp,Cakephp 3.0,我知道这些问题不受欢迎,但我试图在CakePHP上提问,但没有得到回应。我想把CrudCakePHP插件添加到我的一个项目中。为了处理错误,插件可以使用自定义错误处理程序: //Crud ErrorHandler registration - simplified (new ErrorHandler($exceptionRenderer))->register(); 但是,仅根据以下检查注册错误处理程序: $appClass = Configure::read('App.namespac
Crud
CakePHP插件添加到我的一个项目中。为了处理错误,插件可以使用自定义错误处理程序:
//Crud ErrorHandler registration - simplified
(new ErrorHandler($exceptionRenderer))->register();
但是,仅根据以下检查注册错误处理程序:
$appClass = Configure::read('App.namespace') . '\Application';
// If `App\Application` class exists it means Cake 3.3's PSR7 middleware
// implementation is used and it's too late to register new error handler.
if (!class_exists($appClass, false)) {
$this->registerExceptionHandler();
}
当被问及这项检查背后的原因时,一位github回购会员告诉我:
这是因为无法从ApiListener访问中间件队列来设置自定义异常呈现程序。[…]您不应该自己注册错误处理程序。错误处理程序中间件处理这个问题。这样做肯定会有问题
现在我不能完全弄清楚错误处理程序和ErrorHandlerMiddleware
之间的关系。关于中间件,请注意以下几点:
Cake\Error\Middleware\ErrorHandlerMiddleware捕获包装中间件中的异常,并使用异常处理程序呈现错误页面
此描述的第一部分似乎暗示ErrorHandlerMiddleware
仅捕获来自其他中间件的异常。但据我所知,整个应用程序都是由它们包装的。描述的第二部分说明中间件使用异常处理程序来显示错误。然而,通过查看中间件的外观,我没有看到对错误处理程序的引用,而是一个异常呈现程序,它是另外一种东西。唯一完成的错误处理似乎是一个简单的try/catch语句,它使用呈现器呈现异常。在我看来,这似乎是文档中的一个错误,因为没有实际使用任何处理程序实例
最后,上面的中间件描述指向一个文档页面,该页面声明:
您可以使用任何回调类型创建错误处理程序。例如,您可以使用名为AppError
的类来处理错误。通过扩展BaseErrorHandler
,您可以提供用于处理错误的自定义逻辑。例如:
但这让我回到了一开始,Crud
github团队成员告诉我不要这样做
问题:
ErrorHandlerMiddleware
与
自定义错误处理程序李>
ErrorHandlerMiddleware
,但也注册了自定义错误处理程序,会发生什么?哪个捕获什么(例如中间件中的异常vs控制器中的异常)李>
由于历史/向后兼容性原因,全局处理程序和中间件处理程序同时存在,请检查并。@ndm-cake在哪里区分是否使用旧的ErrorHandler和中间件?我找不到任何关于ErrorHandler@mederomuraliev默认情况下,
ErrorHandler
已注册,它将捕获应用程序未处理的所有错误和异常,或者通过错误处理程序中间件。由于历史/向后兼容性的原因,全局处理程序和中间件处理程序同时存在,请检查并。@ndm-cake在哪里区分是否使用旧的错误处理程序和中间件?我找不到任何关于ErrorHandler@mederomuraliev默认情况下,ErrorHandler
已注册,它将捕获应用程序或错误处理程序中间件未处理的所有错误和异常。
// In config/bootstrap.php
use App\Error\AppError;
$errorHandler = new AppError();
$errorHandler->register();