معالجة الأخطاء في جافا سكريبت

معالجة الأخطاء في جافا سكريبت

تشرح هذه المقالة كيفية معالجة الأخطاء في جافا سكريبت۔

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"
4console.log(error.stack);    // Stack trace (information about where the error occurred)

رمي الأخطاء باستخدام 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 حتى إذا تم رفع خطأ۔

خصائص كائن Error

كائن Error يحتوي على الخصائص التالية۔

  • message: هذا هو نص رسالة الخطأ۔
  • name: اسم الخطأ، والافتراضي هو "Error"۔
  • stack: تتبع المكدس الذي يحتوي على معلومات عن مكان وقوع الخطأ، وهو مفيد لأغراض التصحيح۔

فوائد معالجة الاستثناءات

من خلال تنفيذ معالجة الأخطاء بشكل صحيح، يمكنك منع التطبيق من التعطل عند حدوث سلوك غير متوقع۔ باستخدام صياغة 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 أيضًا.۔

YouTube Video