vue.js - 如何从组件内的单个点捕获 vuejs 错误

标签 vue.js vuejs2

我有一个组件,我在 catch 中使用了很多带有 then().catch() 的 axios 我总是抛出 console.error() 像:

axios.get(
 //...
).then(
 //...
).catch(
 error => {
  console.error(..)
 }
)

还有其他几个地方我也抛出错误。我正在寻找是否有全局处理错误的方法。我知道也许对于 axios 我可以使用拦截器,但是 vue 组件是否可以捕获错误,所以我可以将它们统一在一个函数中?

最佳答案

Vue API 提供了the errorHandler ,但它不会捕获方法中的错误(强调我的):

Assign a handler for uncaught errors during component render function and watchers.

示例如下。

组件渲染过程中的错误处理:

Vue.config.errorHandler = function (err, vm, info)  {
  console.log('[Global Error Handler]: Error in ' + info + ': ' + err);
};

Vue.component('person', {template: '#person-template', props: ['person']});
new Vue({
  el: '#app',
  data: {
    people: [
      {name: 'Check the console', address: {zip: 4444}},
      {name: 'No address',     /* address: {zip: 5555} */}
    ]
  }
})
<script src="https://unpkg.com/vue@2.5.14/dist/vue.min.js"></script>
<template id="person-template">
  <div>
    Name: <b>{{ person.name }}</b> - Zip: {{ person.address.zip }}
  </div>
</template>
<div id="app">
  <div v-for="person in people">
    <person :person="person"></person>
  </div>
</div>

观察者内部的错误处理:

Vue.config.errorHandler = function (err, vm, info)  {
  console.log('[Global Error Handler]: Error in ' + info + ': ' + err);
};

Vue.component('person', {template: '#person-template', props: ['person']});
new Vue({
  el: '#app',
  data: {
    message: "Some message"
  },
  watch: {
    message() {
      console.log(this.message.trim());
    }
  }
})
<script src="https://unpkg.com/vue@2.5.14/dist/vue.min.js"></script>

<div id="app">
  Message: {{ message }}
  <br>
  <button @click="message = null">click here to set message to null and provoke watcher error</button>
</div>

但是...

...不幸的是,errorHandler 不适用于方法:

Vue.config.errorHandler = function (err, vm, info)  {
  console.log('[Global Error Handler]: Error in ' + info + ': ' + err);
};

Vue.component('person', {template: '#person-template', props: ['person']});
new Vue({
  el: '#app',
  methods: {
    goMethod() {
      console.log(this.invalidProperty.trim());
    }
  }
})
<script src="https://unpkg.com/vue@2.5.14/dist/vue.min.js"></script>

<div id="app">
  <button @click="goMethod">click to execute goMethod() and provoke error that will NOT be handled by errorHandler</button>
</div>

最后:

I know maybe for the axios I can user interceptor but does vue components have away to catch errors, so I can unify them inside one function?

最重要的是,目前还没有办法在 Vue 中将它们统一到一个函数中。

所以你的猜测是正确的,你最好的选择是定义axios interceptors :

Axios Interceptors

You can intercept requests or responses before they are handled by then or catch.

// Add a request interceptor
axios.interceptors.request.use(function (config) {
    // Do something before request is sent
    return config;
  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  });

// Add a response interceptor
axios.interceptors.response.use(function (response) {
    // Do something with response data
    return response;
  }, function (error) {
    // Do something with response error
    return Promise.reject(error);
  });

关于vue.js - 如何从组件内的单个点捕获 vuejs 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49214634/

相关文章:

javascript - VueJS可以多个元素调用同一个方法

javascript - Vue.js orderBy 无法正确处理大写和小写

javascript - Vue.js .我的方法中的函数未被识别

javascript - 如何在 vuejs 2 中包含 css 文件?

vue.js - Vue-Router 数据仅获取一次

javascript - 在 vue.js 中获取具有动态行的表中的选择标记值

vue.js - Nuxt 3 - 如何从组件访问插件注入(inject)?

javascript - vue 2.3 AJAX数据绑定(bind)不更新

vue.js - 如何使用 webpack 在 Vue.js 中的路由组件之间共享数据?

web - 我如何根据 Vuetify 中的屏幕大小更改按钮的位置