cordiverse/cordis

Feature Request: 为cordis增加全局错误处理接口

ConstasJ opened this issue · 6 comments

需求

我们正在开发一个基于cordis的AOP项目,现在需要做一个错误处理插件,但cordis没有关于获取全局错误的API接口,所以目前只能通过监听UncaughtErrors和UnhandledRejections事件来进行处理,但这样的话使用try-catch块的插件的报错将无法捕获。

建议

所以,如果cordis能够增加一个类似于ctx.error()的全局错误报告接口并可以通过一个类似于ctx.addErrorHandler()的接口处理通过ctx.error()报告的错误,将使基于cordis的项目的错误处理简易很多。

以上是我们的一点小小建议。如果能够采纳并实装的话,我们将感激不尽。

很有价值的提议。我们会认真考虑增加对事件的错误处理方案(不叫全局错误,cordis 也不会捕获非 cordis 抛出的错误)。

我觉得可以添加一个内置服务ctx.error,并捕获来自cordis的uncaughterror和unhandledrejection

我基本可以确定不是这种实现方式。

  1. 本来就没有所谓「来自 cordis」的 uncaught error 的概念,有错误也是事件系统漏出来的,要改良也是改良事件系统,这也算这个 issue 的本来目的。
  2. 至于 unhandled rejection 从理论上就没有办法捕获,出现此情况就是你写的不好跟 cordis 没有任何关系。cordis 不依赖 node 环境运行,并没有 process.on()

前面的那个ctx.error()我觉得是真的可以考虑下

这还是同样的逻辑,我们会改进事件系统,让开发者可以独立捕获每个事件的错误。我们不会统一捕获所有事件的错误,因为错误本质上是切面化的 API,抛出错误本身可以是事件的预期行为,引入全局的捕获行为相当于 cordis 否认了 throw 作为一个 JavaScript 语法。同时,如果开发者不妥善处理错误,即使我们解决了 uncaught error 也还会有 unhandled rejection,因此任何基于 cordis 的错误捕获都是无法解决你的需求的。为了捕获所有错误,你仍然需要 process.on()

2.5.0 版本下的所有错误都可以被独立捕获了。