소스 검색

Add cast for the fake TaggedError

John Lees-Miller 6 년 전
부모
커밋
c44054a31b
2개의 변경된 파일46개의 추가작업 그리고 2개의 파일을 삭제
  1. 44 0
      libraries/o-error/doc/benchmark.js
  2. 2 2
      libraries/o-error/index.js

+ 44 - 0
libraries/o-error/doc/benchmark.js

@@ -0,0 +1,44 @@
+//
+// A quick microbenchmark for OError.tag.
+//
+const OError = require('..')
+
+function benchmark(fn, repeats = 100000) {
+  const startTime = process.hrtime()
+  for (let i = 0; i < repeats; ++i) {
+    fn()
+  }
+  const elapsed = process.hrtime(startTime)
+  return elapsed[0] * 1e3 + elapsed[1] * 1e-6
+}
+
+function throwError() {
+  throw new Error('here is a test error')
+}
+
+console.log(
+  'no tagging: ',
+  benchmark(() => {
+    try {
+      throwError()
+      return 1
+    } catch (error) {
+      return 0
+    }
+  }),
+  'ms'
+)
+
+console.log(
+  'tagging: ',
+  benchmark(() => {
+    try {
+      throwError()
+      return 1
+    } catch (error) {
+      OError.tag(error, 'here is a test tag')
+      return 0
+    }
+  }),
+  'ms'
+)

+ 2 - 2
libraries/o-error/index.js

@@ -56,8 +56,8 @@ class OError extends Error {
 
     let tag
     if (Error.captureStackTrace) {
-      // Hide this function in the stack trace.
-      tag = { name: 'TaggedError', message, info }
+      // Hide this function in the stack trace, and avoid capturing it twice.
+      tag = /** @type TaggedError */ ({ name: 'TaggedError', message, info })
       Error.captureStackTrace(tag, OError.tag)
     } else {
       tag = new TaggedError(message, info)