]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor(runtime-core): adjust error handling behavior
authorEvan You <yyx990803@gmail.com>
Tue, 28 Jul 2020 04:17:59 +0000 (00:17 -0400)
committerEvan You <yyx990803@gmail.com>
Tue, 28 Jul 2020 14:40:25 +0000 (10:40 -0400)
- Crash in dev to make the errors more noticeable
- Recover in prod to reduce impact on end users

packages/runtime-core/__tests__/errorHandling.spec.ts
packages/runtime-core/src/errorHandling.ts

index 56ae8b26a0d796fe3baba8eda6f0be61fe9c6b8b..47d6c4892627e1faaaf31525a280000e63629bc4 100644 (file)
@@ -10,17 +10,8 @@ import {
   defineComponent,
   watchEffect
 } from '@vue/runtime-test'
-import { setErrorRecovery } from '../src/errorHandling'
 
 describe('error handling', () => {
-  beforeEach(() => {
-    setErrorRecovery(true)
-  })
-
-  afterEach(() => {
-    setErrorRecovery(false)
-  })
-
   test('propagation', () => {
     const err = new Error('foo')
     const fn = jest.fn()
@@ -470,8 +461,6 @@ describe('error handling', () => {
   })
 
   it('should warn unhandled', () => {
-    const onError = jest.spyOn(console, 'error')
-    onError.mockImplementation(() => {})
     const groupCollapsed = jest.spyOn(console, 'groupCollapsed')
     groupCollapsed.mockImplementation(() => {})
     const log = jest.spyOn(console, 'log')
@@ -496,14 +485,18 @@ describe('error handling', () => {
       render() {}
     }
 
-    render(h(Comp), nodeOps.createElement('div'))
+    let caughtError
+    try {
+      render(h(Comp), nodeOps.createElement('div'))
+    } catch (caught) {
+      caughtError = caught
+    }
     expect(fn).toHaveBeenCalledWith(err, 'setup function')
     expect(
       `Unhandled error during execution of setup function`
     ).toHaveBeenWarned()
-    expect(onError).toHaveBeenCalledWith(err)
+    expect(caughtError).toBe(err)
 
-    onError.mockRestore()
     groupCollapsed.mockRestore()
     log.mockRestore()
   })
index 7095df775680f69af2da5b70088904fef803f30c..a922e964e5d50e4a022d8b06485afa7d229fa884 100644 (file)
@@ -134,25 +134,20 @@ export function handleError(
   logError(err, type, contextVNode)
 }
 
-// Test-only toggle for testing the unhandled warning behavior
-let forceRecover = false
-export function setErrorRecovery(value: boolean) {
-  forceRecover = value
-}
-
 function logError(err: unknown, type: ErrorTypes, contextVNode: VNode | null) {
-  // default behavior is crash in prod & test, recover in dev.
-  if (__DEV__ && (forceRecover || !__TEST__)) {
+  if (__DEV__) {
     const info = ErrorTypeStrings[type]
     if (contextVNode) {
       pushWarningContext(contextVNode)
     }
     warn(`Unhandled error${info ? ` during execution of ${info}` : ``}`)
-    console.error(err)
     if (contextVNode) {
       popWarningContext()
     }
-  } else {
+    // crash in dev so it's more noticeable
     throw err
+  } else {
+    // recover in prod to reduce the impact on end-user
+    console.error(err)
   }
 }