معالجة الأخطاء في جافا سكريبت
تشرح هذه المقالة كيفية معالجة الأخطاء في جافا سكريبت۔
YouTube Video
معالجة الأخطاء في جافا سكريبت
تُعتبر معالجة الأخطاء في جافا سكريبت ميزة مهمة لالتقاط المشاكل غير المتوقعة ومعالجتها بشكل مناسب عند مواجهتها من قبل البرنامج۔ في الأساس، من الشائع استخدام بناء الجملة try...catch لالتقاط الأخطاء ومعالجتها۔ بالإضافة إلى ذلك، عند العمل مع الوعود أو العمليات غير المتزامنة، يمكن معالجة الأخطاء باستخدام async/await أو Promise.prototype.catch۔
بناء الجملة try...catch
يُستخدم try...catch لالتقاط الأخطاء ومعالجتها عندما تحدث داخل كتلة شفرة۔
1try {
2 // Code that may throw an error
3 let result = riskyFunction();
4 console.log(result);
5} catch (error) {
6 // Catch and handle the error
7 console.error("An error occurred:", error.message);
8} finally {
9 // Code that will always execute
10 console.log("Error handling has completed.");
11}- إذا حدث خطأ داخل كتلة
try، يتم إيقاف تنفيذ البرنامج وتشغيل كتلةcatch۔ - يتم تنفيذ كتلة
finallyدائمًا، سواءً كانت هناك أخطاء أم لا۔ تُعد هذه العملية مفيدة لتحرير الموارد أو تنفيذ العمليات النهائية، وما إلى ذلك۔
إلقاء الأخطاء (throw)
في جافا سكريبت، يمكن تنشيط الخطأ صراحة باستخدام الكلمة الرئيسية throw۔ يُستخدم عند إلقاء رسائل خطأ مخصصة أو أخطاء مخصصة۔
1function checkAge(age) {
2 if (age < 18) {
3 throw new Error("You are under 18 years old.");
4 }
5 return "Age verification completed.";
6}
7
8try {
9 let result = checkAge(15);
10 console.log(result);
11} catch (error) {
12 console.error(error.message); // Displays "You are under 18 years old."
13}معالجة الأخطاء في العمليات غير المتزامنة (Promise و async/await)
عند تنفيذ العمليات غير المتزامنة، تختلف معالجة الأخطاء إلى حد ما۔ عند استخدام الوعود، يتم التقاط الأخطاء باستخدام الطريقة catch۔
1let promise = new Promise((resolve, reject) => {
2 // Asynchronous operation
3 setTimeout(() => reject(new Error("An issue has occurred!")), 1000);
4});
5
6promise
7 .then(result => console.log(result))
8 .catch(error => console.error(error.message)); // Displays "An issue has occurred!"
عند تنفيذ العمليات غير المتزامنة باستخدام async/await، يمكن معالجة الأخطاء باستخدام try...catch۔
1async function fetchData() {
2 try {
3 let response = await fetch('https://api.example.com/data');
4 let data = await response.json();
5 console.log(data);
6 } catch (error) {
7 console.error("An error occurred while fetching data:", error.message);
8 }
9}
10
11fetchData();الملخص
- يمكنك التقاط الأخطاء المتزامنة باستخدام بناء الجملة
try...catch۔ - يمكنك إلقاء أخطائك الخاصة باستخدام
throw۔ - يمكن معالجة الأخطاء في العمليات غير المتزامنة باستخدام الطريقة
catchمنPromise، أو باستخدامasync/awaitوtry...catch۔
باستخدام هذه الأساليب، يمكنك ضمان عمل برنامجك بشكل صحيح حتى في حالة حدوث الأخطاء۔
Error
تُستخدم الفئة Error لمعالجة الأخطاء۔ توفر إمكانية إنشاء أخطاء وتزويد رسائل الأخطاء وتتبع الكومة۔
1try {
2 throw new Error("Something went wrong");
3} catch (e) {
4 console.log(e.message); // Something went wrong
5}الاستخدام الأساسي
يمكن إنشاء كائن Error بشكل صريح عند حدوث خطأ۔ يمكنك إنشاء مثيل باستخدام new Error() وتمرير رسالة خطأ۔
1const error = new Error("Something went wrong");
2console.log(error.message); // "Something went wrong"
3console.log(error.name); // "Error"
4
5// Stack trace (information about where the error occurred)
6console.log(error.stack);خصائص كائن Error
كائن Error يحتوي على الخصائص التالية۔
message: هذا هو نص رسالة الخطأ۔name: اسم الخطأ، والافتراضي هو"Error"۔stack: تتبع المكدس الذي يحتوي على معلومات عن مكان وقوع الخطأ، وهو مفيد لأغراض التصحيح۔
رمي الأخطاء باستخدام throw
في JavaScript، يمكنك رمي خطأ باستخدام الكلمة المفتاحية throw۔ يُستخدم هذا لمقاطعة المعالجة في حالات محددة وتمرير التحكم إلى معالج الأخطاء۔
1function doSomething() {
2 throw new Error("This function is not yet implemented");
3}
4
5try {
6 doSomething();
7} catch (e) {
8 console.error(e.message); // "This function is not yet implemented"
9}يمكن التقاط الأخطاء الملقاة باستخدام throw باستخدام بناء الجملة try...catch۔
إنشاء أخطاء مخصصة
في JavaScript، يمكنك إنشاء أخطاء مخصصة خاصة بك عن طريق توسيع فئة Error۔ يتيح لك ذلك إنشاء أخطاء مخصصة لحالات محددة۔
1class CustomError extends Error {
2 constructor(message) {
3 super(message); // Call the parent class constructor
4 this.name = "CustomError"; // Set the error name
5 }
6}
7
8try {
9 throw new CustomError("A custom error has occurred");
10} catch (e) {
11 console.error(e.name); // "CustomError"
12 console.error(e.message); // "A custom error has occurred"
13}فئات الأخطاء المدمجة
JavaScript لديها العديد من فئات الأخطاء المدمجة التي توسع فئة Error۔ تُستخدم هذه لتمثيل أخطاء محددة۔
ReferenceError: يحدث عندما تشير إلى متغير غير موجود۔TypeError: يحدث عندما يكون نوع القيمة مختلفًا عن النوع المتوقع۔RangeError: يحدث عندما يكون الرقم خارج النطاق المسموح به۔SyntaxError: يحدث عندما يُنفذ كود خاطئ نحويًا۔EvalError: أخطاء تتعلق باستخدام دالةeval()۔ نادراً ما يُستخدم في الوقت الحاضر۔URIError: يحدث عند استخدام URI غير صالح (أخطاء التشفير أو فك التشفير)۔
مثال: ReferenceError
هنا مثال على ReferenceError۔
1try {
2 console.log(undefinedVariable); // Undefined variable
3} catch (e) {
4 console.error(e.name); // "ReferenceError"
5 console.error(e.message); // "undefinedVariable is not defined"
6}مثال: TypeError
هنا مثال على TypeError۔
1try {
2 null.f(); // Attempting to call a function on null
3} catch (e) {
4 console.error(e.name); // "TypeError"
5 console.error(e.message); // "Cannot read properties of null (reading 'f')"
6}كتلة finally
في بناء الجملة try...catch، استخدم كتلة finally للعمليات التي تريد تنفيذها بغض النظر عما إذا كان خطأ قد حدث أم لا۔
1try {
2 throw new Error("An issue has occurred");
3} catch (e) {
4 console.error(e.message); // "An issue has occurred"
5} finally {
6 console.log("Performing cleanup");
7}في هذا المثال، يتم تنفيذ العمليات في الكتلة finally حتى إذا تم رفع خطأ۔
فوائد معالجة الاستثناءات
من خلال تنفيذ معالجة الأخطاء بشكل صحيح، يمكنك منع التطبيق من التعطل عند حدوث سلوك غير متوقع۔ باستخدام صياغة try...catch وكائنات الأخطاء بشكل مناسب، يمكنك كتابة كود أكثر متانة۔
1function divide(a, b) {
2 if (b === 0) {
3 throw new Error("Cannot divide by zero");
4 }
5 return a / b;
6}
7
8try {
9 console.log(divide(4, 0)); // An error will occur
10} catch (e) {
11 console.error(e.message); // "Cannot divide by zero"
12}الملخص
- تُستخدم الفئة
Errorلتمثيل سبب الخطأ ولتنفيذ معالجة الأخطاء۔ - استخدم صياغة
try...catch...finallyلمعالجة الأخطاء ومنع الإنهاء غير المتوقع للتطبيق۔ - من الممكن أيضًا توسيع الفئة
Errorلإنشاء أخطاء مخصصة۔ - يمكنك التعامل مع أنواع مختلفة من الأخطاء باستخدام الفئات المدمجة مثل
TypeErrorوReferenceError۔
يمكنك متابعة المقالة أعلاه باستخدام Visual Studio Code على قناتنا على YouTube.۔ يرجى التحقق من القناة على YouTube أيضًا.۔