راهی بهتر برای رسیدگی به خطاها

مقدمه
سلام ، حدس می زنم! مدتی است که من چیزی را در اینجا ارسال کرده ام. اخیراً من با کتابخانه ها در TypeScript بسیار سر و کار داشته ام که شامل بسیاری از وابستگی های از راه دور مانند اتصالات پایگاه داده یا درخواست های HTTP است که شما می دانید که چگونه همه چیز را در تلاش برای بسته بندی کردن آزار دهنده است ، به خصوص وقتی که حتی از قبل نمی دانید که آیا A عملکرد خاص پرتاب می شود یا نه! در واقع ، من واقعاً عاشق این هستم که چگونه GO HANDS خطاها را انجام می دهد:
f, err := os.Open("filename.ext")
if err != nil {
log.Fatal(err)
}
// do something with the open *File f
این دو مقدار را برمی گرداند ، و همیشه باید بررسی کنید که آیا مقدار خطا صفر نیست یا خیر. این مرتب و نظم و انضباط است. در GO ، شما همیشه از خطاهای احتمالی آگاه هستید و همیشه آنها را اداره می کنید. GO به هیچ وجه از استثنائات استفاده نمی کند.
با این حال من همچنین عاشق ظرافت و انعطاف پذیری TypeScript هستم و فکر کردم که چگونه می توانم به این زبان به چیزی مشابه (حداقل از راه دور) برسم.
همیشه بررسی کنید
اینگونه است که من به این توابع رسیدم:
async function checkAsync<Args extends any[], Type>(
fnToCheck: (...args: Args) => Promise<Type>,
...args: Args
): Promise<Type | Error> {
try {
const result = await fnToCheck(...args);
return result;
} catch (e) {
return new Error(String(e), { cause: e });
}
}
function check<Args extends any[], Type>(
fnToCheck: (...args: Args) => Type,
...args: Args
): Type | Error {
try {
const result = fnToCheck(...args);
return result;
} catch (e) {
return new Error(String(e), { cause: e });
}
}
این با رویکرد Go متفاوت است ، اما هنوز هم این کار را انجام می دهد: به جای امتحان کردن ، شما فقط باید بررسی کردن عملکرد شما ، و شما یک نوع | خطا سپس خطا را بررسی می کنید ، و خوب است که بروید! در اصل این فقط یک بسته بندی امتحان است که پرتاب نمی کند بلکه در عوض خطاها را به عنوان مقادیر برمی گرداند. البته ، نمی داند برخی از توابع پرتاب می کنند یا نه (جدا از توابع تعریف شده توسط شما) ، اما این هنوز یک پیشرفت است.
من این را به عنوان یک بسته NPM منتشر کرده ام ، با تمام زمان های اجرا کار می کند و از نوع ایمن است.
در اینجا پیوند repo است: https://github.com/zakharsmirnoff/always-check
در اینجا پیوند NPM است: https://www.npmjs.com/package/always-check
احساس راحتی کنید که در نظرات بحث کنید ، شاید من چیزی را از دست بدهم یا شاید عملکردی وجود داشته باشد که ممکن است بخواهید اضافه کنید؟