Преглед изворни кода

wip: adjust update error reporting

Evan You пре 9 година
родитељ
комит
a52a094bef

+ 3 - 7
src/core/instance/render.js

@@ -60,18 +60,14 @@ export function renderMixin (Vue: Class<Component>) {
     try {
       vnode = render.call(vm._renderProxy, vm.$createElement)
     } catch (e) {
-      if (process.env.NODE_ENV !== 'production') {
-        warn(`Error when rendering ${formatComponentName(vm)}:`)
-      }
       /* istanbul ignore else */
       if (config.errorHandler) {
         config.errorHandler.call(null, e, vm)
       } else {
-        if (isServerRendering()) {
-          throw e
-        } else {
-          console.error(e)
+        if (process.env.NODE_ENV !== 'production') {
+          warn(`Error when rendering ${formatComponentName(vm)}:`)
         }
+        throw e
       }
       // return previous vnode to prevent render error causing blank component
       vnode = vm._vnode

+ 4 - 4
src/core/observer/watcher.js

@@ -166,14 +166,14 @@ export default class Watcher {
           try {
             this.cb.call(this.vm, value, oldValue)
           } catch (e) {
-            process.env.NODE_ENV !== 'production' && warn(
-              `Error in watcher "${this.expression}"`,
-              this.vm
-            )
             /* istanbul ignore else */
             if (config.errorHandler) {
               config.errorHandler.call(null, e, this.vm)
             } else {
+              process.env.NODE_ENV !== 'production' && warn(
+                `Error in watcher "${this.expression}"`,
+                this.vm
+              )
               throw e
             }
           }

+ 2 - 1
src/core/util/env.js

@@ -66,8 +66,9 @@ export const nextTick = (function () {
   /* istanbul ignore if */
   if (typeof Promise !== 'undefined' && isNative(Promise)) {
     var p = Promise.resolve()
+    var logError = err => { console.error(err) }
     timerFunc = () => {
-      p.then(nextTickHandler)
+      p.then(nextTickHandler).catch(logError)
       // in problematic UIWebViews, Promise.then doesn't completely break, but
       // it can get stuck in a weird state where callbacks are pushed into the
       // microtask queue but the queue isn't being flushed, until the browser

+ 1 - 0
test/unit/features/global-api/config.spec.js

@@ -39,6 +39,7 @@ describe('Global config', () => {
       Vue.config.errorHandler = spy
       const err = new Error()
       const vm = new Vue({
+        render () {},
         data: { a: 1 },
         watch: {
           a: () => {