Simple helper to handle errors, inspired by Golang solution
pnpm i cope
Other package managers
npm i cope
yarn add cope
- Simplicity: Avoid try/catch blocks scattered across your code
- Type Safety: You know exactly what types to expect in success and failure cases
- Consistency: Standardized structure for handling errors in sync and async code
import { cope } from 'cope';
const [result, error] = cope(() => JSON.parse('{"a": 123}'));
if (error)
// process error
else
// process result
const [result = {count: 0}, error] = cope(() => JSON.parse('_broken_"count": 123}'));
if (error)
console.warn('fail')
// result is always defined
Note
This is why, the util returns undefined instead of null
cope(() => window.querySelector('#dynamic-element').scrollTo(123, 0))
// ...guaranteed executions
Stepwise
const [fetchResult, fetchingError] = await cope(() => fetch('https://example.com'));
if (fetchingError) {
console.error('Request failed')
return
}
const [result = null, parsingError] = await cope(() => fetchResult.json());
if (parsingError)
console.warn('Cannot parse response data')
// process result
Or just
const [result = null, error] = await cope(
() => fetch('https://example.com')).then(d=>d.json())
);
if (error) {
console.error('Somewhere failed 🌚')
return
}
// process result
cope<Throws, Executor, Result>(executor: Executor): CopeResult<Result, Throws>
-
Generics
Throws
- You can define types of errors, that can be thrown byexecutor
. Default isError
Executor
- Private, don't change it!Result
- Private, don't change it!
-
Parameters
executor
(Function): The function to be executed. It can be either a synchronous or asynchronous function.
-
Returns
- If sync
executor
- [Result
, undefined] | [undefined,Throws
] - If async
executor
- Promise<[Result
, undefined] | [undefined,Throws
]>
- If sync