ابنِ استراتيجية أخطاء صريحة بأصناف مخصصة، وحدود التقاط موضوعة في مكانها، ووحدة تحكم مستثمَرة إلى أقصى طاقتها.
افتح هذا الدرس في Kodokonالمتانة ليست التقاط كل خطأ، بل التقاطه في المكان الصحيح. قاعدة ميدانية: افشل بسرعة وبوضوح أقرب ما يمكن من الخطأ (تحقق، ثوابت)، ولا تلتقط إلا عند الحدود حيث تستطيع أن تتفاعل فعلا: أظهِر رسالة، أعد المحاولة، سجّل. فـ try/catch الذي لا يفعل شيئا مفيدا لا يجعل الشيفرة أأمن؛ بل يجعل الإخفاقات صامتة.
function parseConfig(json) {
try {
return JSON.parse(json);
} catch (error) {
console.error("Unreadable config:", error.message);
throw error; // rethrow: nothing can be fixed here
} finally {
console.log("Finished reading configuration");
}
}السلاسل النصية المجردة لا تصنع استراتيجية أخطاء. وسّع Error لإنشاء أصناف تحمل بيانات مهيكلة (حالة HTTP، حقل غير صالح) يمكن تمييزها بـ instanceof. ومنذ ES2022، يسلسل خيار cause الخطأ الأصلي بالخطأ رفيع المستوى: فتعرض رسالة عملية واضحة دون فقدان الأثر التقني.
class ApiError extends Error {
constructor(message, status, options) {
super(message, options);
this.name = "ApiError";
this.status = status;
}
}
try {
const low = new Error("socket timeout");
throw new ApiError("Profile unavailable", 503,
{ cause: low });
} catch (error) {
if (error instanceof ApiError) {
console.error(error.status, error.cause.message);
}
}تقدّم وحدة التحكم أكثر بكثير من log: يصفّ console.table مجموعات الكائنات، ويعشّش group/groupEnd المخرجات، ويقيس time/timeEnd مدة، ولا يسجّل console.assert إلا حين يكون الشرط خاطئا، ويطبع console.trace مكدس الاستدعاءات الحالي. ومجتمعةً، تتفوق هذه الأدوات بلا منازع على وابل من استدعاءات log المجهولة.
const users = [
{ name: "Ada", role: "admin" },
{ name: "Linus", role: "dev" },
];
console.table(users);
console.group("Checks");
console.assert(users.length > 0, "Empty list");
console.time("sort");
users.sort((a, b) => a.name.localeCompare(b.name));
console.timeEnd("sort");
console.groupEnd();finally؟cause عند إنشاء خطأ؟console.assert(condition, message)؟