on-error-resume-next
Run a function, synchronously or asynchronously, and ignore errors.
The name come from Visual Basic. The original On Error Resume Next
statement is considered a bad error handling practice.
Although the perception of the feature is negative, when scoped and used responsibly, it can become a very helpful utility function.
When using onErrorResumeNext
, please be responsible and fully understand the impact of ignoring errors.
Breaking changes
New in 2.0
We introduced named exports and removed default imports. The default is synchronous. The "auto-detection" version is being moved to under 'on-error-resume-next/auto'.
- import onErrorResumeNext from 'on-error-resume-next';
+ import { onErrorResumeNext } from 'on-error-resume-next/auto';
It is recommended to use either synchronous or asynchronous version for better clarity.
Usage
onErrorResumeNext
will return the result if it is a success. For example,
import { onErrorResumeNext } from 'on-error-resume-next';
const returned = onErrorResumeNext(() => JSON.parse('{"hello":"World!"}'));
expect(returned).toEqual({ hello: 'World!' });
const thrown = onErrorResumeNext(() => JSON.parse('<xml />'));
expect(thrown).toBeUndefined();
Notes: if an asynchronous function is being passed to onErrorResumeNext()
, it will throw to protect from false negatives. Please use on-error-resume-next/async
for asynchronous functions.
Asynchronous using async
/await
onErrorResumeNext
will capture both exceptions (synchronous) and rejections (asynchronous). The returned value is always a Promise
object.
import { onErrorResumeNext } from 'on-error-resume-next/async';
const resolution = onErrorResumeNext(() => Promise.resolve('Hello, World!'));
await expect(resolution).resolves.toBe('Hello, World!');
const returned = onErrorResumeNext(() => 'Hello, World!');
await expect(returned).resolves.toBe('Hello, World!');
const rejection = onErrorResumeNext(() => Promise.reject(new Error()));
await expect(rejection).resolves.toBeUndefined();
const thrown = onErrorResumeNext(() => {
throw new Error();
});
await expect(thrown).resolves.toBeUndefined();
Auto-detecting synchronous/asynchronous functions
For best experience, please use synchronous or asynchronous version instead.
on-error-resume-next/auto
will handle both exceptions (synchronous) and rejections (asynchronous) accordingly.
import { onErrorResumeNext } from 'on-error-resume-next/auto';
const returned = onErrorResumeNext(() => 'Hello, World!');
expect(returned).toEqual('Hello, World!');
const thrown = onErrorResumeNext(() => {
throw new Error('Hello, World!');
});
expect(thrown).toEqual(undefined);
const resolution = onErrorResumeNext(() => Promise.resolve('Hello, World!'));
await expect(resolution).resolves.toBe('Hello, World!');
const rejection = onErrorResumeNext(() => Promise.reject(new Error()));
await expect(rejection).resolves.toBeUndefined();
Sync vs. async vs. auto
The following table show how each version react with different passing functions.
| Default (sync) | Async | Auto |
---|
return 1 | 1 | Promise.resolve(1) | 1 |
throw 2 | undefined | Promise.resolve(undefined) | undefined |
Promise.resolve(3) | Not supported, will throw | Promise.resolve(3) | Promise.resolve(3) |
Promise.reject(4) | Not supported, will throw | Promise.resolve(undefined) | Promise.resolve(undefined) |
Contributions
Like us? Star us.
Want to make it better? File us an issue.
Don't like something you see? Submit a pull request.