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.
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.
onErrorResumeNext
will return the result if it is a success. For example,
import { onErrorResumeNext } from 'on-error-resume-next';
// Will return result on returns.
const returned = onErrorResumeNext(() => JSON.parse('{"hello":"World!"}'));
expect(returned).toEqual({ hello: 'World!' });
// Will return undefined on throws.
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.
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';
// "async" will return Promise on resolves.
const resolution = onErrorResumeNext(() => Promise.resolve('Hello, World!'));
await expect(resolution).resolves.toBe('Hello, World!');
// "async" will return Promise on returns.
const returned = onErrorResumeNext(() => 'Hello, World!');
await expect(returned).resolves.toBe('Hello, World!');
// "async" will return Promise on rejects.
const rejection = onErrorResumeNext(() => Promise.reject(new Error()));
await expect(rejection).resolves.toBeUndefined();
// "async" will return Promise on throws.
const thrown = onErrorResumeNext(() => {
throw new Error();
});
await expect(thrown).resolves.toBeUndefined();
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';
// "auto" will return result on returns.
const returned = onErrorResumeNext(() => 'Hello, World!');
expect(returned).toEqual('Hello, World!');
// "auto" will return undefined on throws.
const thrown = onErrorResumeNext(() => {
throw new Error('Hello, World!');
});
expect(thrown).toEqual(undefined);
// "auto" will return Promise on resolves.
const resolution = onErrorResumeNext(() => Promise.resolve('Hello, World!'));
await expect(resolution).resolves.toBe('Hello, World!');
// "auto" will return Promise on rejects.
const rejection = onErrorResumeNext(() => Promise.reject(new Error()));
await expect(rejection).resolves.toBeUndefined();
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) |
Like us? Star us.
Want to make it better? File us an issue.
Don't like something you see? Submit a pull request.