ano-mr-site/lib/js/catcher.js

37 lines
1.0 KiB
JavaScript

/** тип async function */
const AsyncFunction = Object.getPrototypeOf(async () => {}).constructor
/**
* Безопасный запуск востановителя
* @param {(...errs: Error[]) => void} restorer
*/
const start_restorer = (restorer) => (...errs) => {
try {
return restorer(...errs)
} catch (e) {
console.error(e)
throw e
}
}
/**
* Функция отлова исключений
* @param {(...args: any[]) => any} func
* @param {(...errs: Error[]) => void} restorer
* @returns {(...args: any[]) => any}
*/
const recovery = (func, restorer = (...args) => {throw new Error(...args)}) => {
let resFunc
if(func instanceof AsyncFunction)
resFunc = async (...args) => {
try {return await func(...args)}
catch (e) {return start_restorer(restorer)(e)}
}
else
resFunc = (...args) => {
try {return func(...args)}
catch (e) {return start_restorer(restorer)(e)}
}
return resFunc
}