| import { config } from '../config'; |
| |
| let context: { errorThrown: boolean; error: any } | null = null; |
| |
| /** |
| * Handles dealing with errors for super-gross mode. Creates a context, in which |
| * any synchronously thrown errors will be passed to {@link captureError}. Which |
| * will record the error such that it will be rethrown after the call back is complete. |
| * TODO: Remove in v8 |
| * @param cb An immediately executed function. |
| */ |
| export function errorContext(cb: () => void) { |
| if (config.useDeprecatedSynchronousErrorHandling) { |
| const isRoot = !context; |
| if (isRoot) { |
| context = { errorThrown: false, error: null }; |
| } |
| cb(); |
| if (isRoot) { |
| const { errorThrown, error } = context!; |
| context = null; |
| if (errorThrown) { |
| throw error; |
| } |
| } |
| } else { |
| // This is the general non-deprecated path for everyone that |
| // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling) |
| cb(); |
| } |
| } |
| |
| /** |
| * Captures errors only in super-gross mode. |
| * @param err the error to capture |
| */ |
| export function captureError(err: any) { |
| if (config.useDeprecatedSynchronousErrorHandling && context) { |
| context.errorThrown = true; |
| context.error = err; |
| } |
| } |