【问题标题】:How to implement global error handling in VueVue中如何实现全局错误处理
【发布时间】:2019-02-03 20:59:49
【问题描述】:

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

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

【问题讨论】:

    标签: vue.js error-handling vuejs2


    【解决方案1】:

    正如@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 rejections

    【讨论】:

    • 这很好,但不会在生产中捕获抛出的错误。在那里,您还需要window.addEventListener('unhandledrejection', () => {...})。但是,这几乎仅在 chrome+edge 中受支持。
    • 设置 window.onerror 肯定会在生产中捕获 throw 错误。
    • @Blauhirn 在深入研究之后,看起来你提到的事件监听器是一种新兴的方法来捕捉承诺拒绝(在承诺函数中抛出的异常。显然 window.error 不会捕捉到这些。谢谢对于提醒,我会将其添加到我的答案中。
    • 提示,Vue.config.errorHandler 默认值为undefined,将由console.error 记录。但是如果开发人员在构建过程中使用UglifyJs 之类的插件删除了console,则错误日志将丢失。
    • @xianshenglu 谢谢,这是一个有趣的见解!我不清楚您建议添加什么(如果有的话)以改进 VueJs 错误处理代码。有没有办法改进我的答案中的代码?
    【解决方案2】:

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

    错误捕获

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

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

    Here is more in-Depth Info About it. 小心它的 Vue 2.5.0+

    【讨论】:

    • 感谢您的参与@Badgy。你能告诉我应该如何实现这个功能吗?
    • @hamidhasani 这有点太深入我自己在这里解释现在我没有时间。在这里我向您推荐这篇文章https://catchjs.com/Docs/Vue,我认为它会对您有所帮助。祝你好运
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多