CakePHP中的错误处理程序和ErrorHandlerMiddleware之间有什么区别?

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

我知道这些问题不受欢迎,但我试图在CakePHP上提问,但没有得到回应。我想把
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();