أثناء تشغيل البرنامج، ستواجه دائمًا أخطاء مختلفة، مثل فتح ملف غير موجود.
إذا حدث خطأ أثناء تشغيل البرنامج فسوف يتوقف، وعلينا استخدام بعض طرق الكشف لتجنب الأخطاء ومنع خروج البرنامج.
توفر لغة Perl طرقًا متعددة لمعالجة الأخطاء، وسنقدمها واحدة تلو الأخرى.
يمكن لعبارة if تحديد القيمة المرجعة للعبارة، ومن الأمثلة على ذلك ما يلي:
إذا (open(DATA, $file)){ ...}else{ die "خطأ: غير قادر على فتح الملف - $!";}
المتغير $! في البرنامج أعاد رسالة خطأ. يمكننا أيضًا تبسيط الكود أعلاه إلى الكود التالي:
open(DATA, $file) ||. die "خطأ: غير قادر على فتح الملف - $!";
الدالة إلا هي عكس if، وسيتم تنفيذها فقط عندما يعود التعبير false، كما هو موضح أدناه:
ما لم(chdir("/etc")){ يموت "خطأ: لا يمكن فتح الدليل - $!";}
تعتبر عبارة "ما لم" مفيدة جدًا عندما تريد تعيين تذكير بالخطأ. يمكننا أيضًا اختصار الكود أعلاه على النحو التالي:
يموت "خطأ: لا يمكن فتح الدليل!: $!" إلا(chdir("/etc"));
سيتم إخراج رسالة الخطأ المذكورة أعلاه فقط عندما يكون هناك خطأ في تبديل الدليل.
فيما يلي مثال بسيط للعامل الثلاثي:
print(موجود($hash{value}) ? 'موجود' : 'غير موجود',"n");
في المثال أعلاه، استخدمنا العامل الثلاثي لتحديد ما إذا كانت قيمة التجزئة موجودة أم لا.
يحتوي المثال على تعبير بقيمتين، بالتنسيق: قيمة التعبير واحد: القيمة الثانية .
يتم استخدام وظيفة التحذير لإطلاق رسالة تحذير، ولن يتم تنفيذ أي عمليات أخرى، ويتم إخراجها إلى STDERR (ملف الإخراج القياسي)، ويتم استخدامها عادةً لمطالبة المستخدم:
chdir('/etc') أو تحذير "لا يمكن تبديل الدلائل"؛
وظيفة القالب مشابهة للتحذير، ولكنها تخرج. يستخدم بشكل عام كمخرج لرسائل الخطأ:
chdir('/etc') أو die "غير قادر على تبديل الدلائل";
في نصوص Perl النصية، إحدى الطرق الشائعة للإبلاغ عن الأخطاء هي استخدام الدالتين تحذير () أو يموت () للإبلاغ عن الأخطاء أو توليدها. بالنسبة لوحدة Carp، يمكنها توفير مستوى إضافي من التحكم في الرسائل التي يتم إنشاؤها، خاصة داخل الوحدة.
توفر وحدة Carp القياسية بدائل لوظائف تحذير () وموت () والتي تكون أكثر إفادة وسهلة الاستخدام في توفير توطين الأخطاء. عند استخدامها داخل وحدة نمطية، يتم تضمين اسم الوحدة ورقم السطر في رسالة الخطأ.
يمكن لوظيفة الكارب إخراج معلومات التتبع الخاصة بالبرنامج، على غرار وظيفة التحذير، وعادةً ما ترسل هذه المعلومات إلى STDERR:
الحزمة T;تتطلب مصدرًا;@ISA = qw/Exporter/;@EXPORT = qw/function/;استخدام Carp;sub function { carp "خطأ في الوحدة!";}1;
استدعاء البرنامج التالي في البرنامج النصي:
استخدم T;وظيفة();
بتنفيذ البرنامج أعلاه تكون نتيجة الإخراج هي:
خطأ في الوحدة النمطية في السطر 4 من test.pl
يشبه cluck() تحذير() ويوفر تتبعًا للمكدس من مكان حدوث الخطأ.
الحزمة T;تتطلب مصدرًا;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp qw(cluck);sub function { cluck "خطأ في الوحدة!";}1;
استدعاء البرنامج التالي في البرنامج النصي:
استخدم T;وظيفة();
بتنفيذ البرنامج أعلاه تكون نتيجة الإخراج هي:
خطأ في الوحدة النمطية! في السطر 9 من T.pm تم استدعاء T::function() في السطر test.pl 4
croak()، مثل die()، ينهي البرنامج النصي.
package T;تتطلب مصدر;@ISA = qw/Exporter/;@EXPORT = qw/function/;استخدام Carp;sub function { croak "خطأ في الوحدة!";}1;
استدعاء البرنامج التالي في البرنامج النصي:
استخدم T;وظيفة();
بتنفيذ البرنامج أعلاه تكون نتيجة الإخراج هي:
خطأ في الوحدة النمطية في السطر 4 من test.pl
الاعتراف () يشبه die () ولكنه يوفر تتبعًا للمكدس من مكان حدوث الخطأ.
package T;تتطلب مصدر;@ISA = qw/Exporter/;@EXPORT = qw/function/;استخدام Carp;sub function { اعترف "خطأ في الوحدة!";}1;
استدعاء البرنامج التالي في البرنامج النصي:
استخدم T;وظيفة();
بتنفيذ البرنامج أعلاه تكون نتيجة الإخراج هي:
خطأ في الوحدة النمطية! في السطر 9 من T.pm تم استدعاء T::function() في السطر test.pl 4