(
action: () => ValueOrPromise<T>,
errorAction: (err: unknown) => T | never = err => {
throw err;
},
finalAction: () => void = () => {},
)
| 211 | * @typeParam T - Type for the return value |
| 212 | */ |
| 213 | export function tryCatchFinally<T>( |
| 214 | action: () => ValueOrPromise<T>, |
| 215 | errorAction: (err: unknown) => T | never = err => { |
| 216 | throw err; |
| 217 | }, |
| 218 | finalAction: () => void = () => {}, |
| 219 | ): ValueOrPromise<T> { |
| 220 | let result: ValueOrPromise<T>; |
| 221 | try { |
| 222 | result = action(); |
| 223 | } catch (err) { |
| 224 | result = reject(err); |
| 225 | } |
| 226 | if (isPromiseLike(result)) { |
| 227 | return result.then(resolve, reject); |
| 228 | } |
| 229 | |
| 230 | return resolve(result); |
| 231 | |
| 232 | function resolve(value: T) { |
| 233 | try { |
| 234 | return value; |
| 235 | } finally { |
| 236 | finalAction(); |
| 237 | } |
| 238 | } |
| 239 | |
| 240 | function reject(err: unknown): T | never { |
| 241 | try { |
| 242 | return errorAction(err); |
| 243 | } finally { |
| 244 | finalAction(); |
| 245 | } |
| 246 | } |
| 247 | } |
| 248 | |
| 249 | /** |
| 250 | * Resolve an iterator of source values into a result until the evaluator |
no test coverage detected