21

我想在 Vue.JS 中进行全局错误处理,就像 Angular 2+ 中的错误处理系统一样。我已经尝试了很多,但我找不到实现这种处理的好方法。

想象一下,您有许多服务方法,并且这些方法应该一个接一个地运行(我的意思是在彼此内部),因此在 prevoius 服务中编写 then 和 catch 方法是如此丑陋和不干净,现在我正在寻找实现此类的干净方法方法。我希望你明白我的意思。

4

2 回答 2

43

正如@Badgy 提到的,您可以安装一个 Vue 错误处理程序来捕获 Vue 遇到的错误。这可以按如下方式完成:

 Vue.config.errorHandler = function (err, vm, info) {
   // handle error
   // `info` is a Vue-specific error info, e.g. which lifecycle hook
   // the error was found in. Only available in 2.2.0+
 }

上面的代码可以放在你喜欢的 javascript 中的任何位置。我在创建 vue 实例之前找到了代码。即在我的 var app = new Vue({...});代码之前。因为它是一个全局的 vue 错误处理程序,它将处理来自所有 vue 实例以及 vue 组件的错误。我发现在实践中它主要捕获 vue 渲染方法中发生的错误。

您可以在此处的官方文档中阅读有关它的更多信息:https ://vuejs.org/v2/api/#errorHandler

对于更一般的(非 vue 相关的)javascript 错误,您仍然需要一个全局错误处理程序,如下所示:

 window.onerror = function (msg, url, line, col, error) {
     //code to handle or report error goes here
 }

同样,此代码可以放置在允许使用 javascript 的任何位置,但通常您希望将其放置在 javascript 堆栈的早期运行。您可以在此处阅读有关此内容的更多信息:https ://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror

最后,为了捕捉“Promise 拒绝”(即从 Promise 函数抛出异常),我们需要监听unhandledrejection事件,因为该window.onerror机制没有捕捉到 Promise 拒绝(感谢@Blauhirn 的提示)。在某些浏览器(目前是 Chrome 和 Edge)中,可以使用以下方法捕获 Promise 拒绝:

 window.addEventListener('unhandledrejection', function(event) {
     //handle error here
     //event.promise contains the promise object
     //event.reason contains the reason for the rejection
 });

有关更多信息,请参阅这个 StackOverflow 问题:Catch all unhandled javascript promise rejects

于 2018-08-29T11:49:08.180 回答
2

我希望我理解你的问题,但这可能是你正在寻找的。

错误捕获

类型:(err:错误,vm:组件,信息:字符串)=> ?boolean

详细信息:当捕获来自任何后代组件的错误时调用。钩子接收三个参数:错误、触发错误的组件实例和包含错误捕获位置信息的字符串。钩子可以返回 false 以阻止错误进一步传播。

这是有关它的更多深入信息。 小心它的 Vue 2.5.0+

于 2018-08-29T06:59:08.120 回答