با سلام خدمت کاربران گرامی سایت پی وی لرن و کاربرانی که علاقمندان به دوره آموزشی پرل Perl. در جلسه گذشته با مدیریت و کار با دایرکتوری ها آشنا شدیم و به شما آموختیم که چگونه یک دایرکتوری را ایجاد نمایید و آن را تغییر دهید و در نهایت نیز با نحوه حذف دایرکتوری ها در پرل آشنا شدید. در این جلسه در کنار علاقمندان دوره پرل به آموزش مدیریت خطاها در پرل می پردازیم.
خطاها و توقف برنامه ها معمولاً به صورت هماهنگ رخ می دهند.
اگر فایلی را باز می کنید وجود ندارد و این وضعیت را به درستی تعریف ننموده اید پس برنامه شما با کیفیت بدی طرح ریزی شده است.
اگر خطایی رخ دهد، برنامه متوقف می شود بنابرین یک خطای معمولی معمولاً با انواع مختلفی از خطاها همراه خواهد بود.
این خطاها ممکن است در حین اجرای برنامه رخ دهند و فرصت لازم برای واکنش مناسب و مدیریت خطاها را از ما سلب نمایند.
اما در آموزش مدیریت خطاها در پرل چندین روش برای مقابله و مدیریت خطاها معرفی خواهد گردید.
if statement روش خوبی برای چک کردن مقادیر بازگشتی از یک statement است؛ برای مثال :
1 2 3 4 5 | if(open(DATA, $file)) { ... } else { die "Error: Couldn't open the file - $!"; } |
در اینجا متغیر !$ پیام خطا واقعی را برمی گرداند.
متناوبا، می توان جایی که این کار منطقی است یک statement را به یک خط در کاست.
برای مثال :
1 | open(DATA, $file) || die "Error: Couldn't open the file $!"; |
تابع unless مخالف و متضاد if statement است.
statements ها می توانند با موفقیت از موقعیت ها status عبور نماید و فقط هنگامی که عبارت های بازگردانی شده اشتباه اند اجرا شود. برای مثال :
1 2 3 | unless(chdir("/etc")) { die "Error: Can't change directory - $!"; } |
بهترین زمان استفاده از unless statement هنگامی است که قصد اعلام یک خطا یا خطاهای متوالی ای را دارد که فقط هنگام بیان اشتباهات رخ می دهند.
این statement هنگام استفاده از یک unless statement نیز دارای تاثیراتی خواهد بود.
1 | die "Error: Can't change directory!: $!" unless(chdir("/etc")); |
اگر در نمونه بالا اپراتور از بین برود؛ کار ما اثر خود را از دست خواهد داد.
برای تست های کوتاه می توان از اپراتور های شرطی استفاده نمود.
1 | print(exists($hash{value}) ? 'There' : 'Missing',"\n"); |
در این نمونه زیاد روشن نیست که ما در پی چه چیزی هستیم.
اما اثر آن چیزی مشابه با استفاده از statement های if یا unless است.
بهترین زمان استفاده از اپراتور های شرطی زمانی است که می خواهید یکی از دو مقادیر را با یک عبارت یا statement به سرعت بازگردانی نمایید.
تابع warn یا تابع هشدار وظیفه ایجاد هشدار را دارد.
در هنگام استفاده این تابع پیامی به STDERR ارسال می شود، اما هیچ اقدام دیگری صورت نمی پذیرد.
بنابرین این تابع زمانی که فقط قصدتان ارسال هشدار به یک کاربر باشد بسیار مفید است.
1 | chdir('/etc') or warn "Can't change directory"; |
تابع die یا تابع مرگ شبیه به تابع هشدار کار می کند؛ جز آن که در آن صدای خروجی نیز وجود دارد.
در یک اسکریپت معمولی، این تابع باعث تاخیر اجرا می گردد.
در صورت بروز خطا در برنامه از این تابع استفاده کنید.
1 | chdir('/etc') or die "Can't change directory"; |
دو موقعیت متفاوت وجود دارد که باید آنها را مدیریت کرد.
توابع die و warn در هنگام فراخوانی توسط ماژول عملکردی متفاوت با یکدیگر دارند.
به مثال زیر که نمایش ساده ای از ماژول است توجه نمایید.
1 2 3 4 5 6 7 8 9 10 11 | package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp; sub function { warn "Error in module!"; } 1; |
هنگام فراخوانی عملکردی شبیه به اسکریپت زیر خواهید داشت.
1 2 | use T; function(); |
کد بالا نتیجه ای به صورت زیر دارد.
1 | Error in module! at T.pm line 9. |
این امر ممکن است بیشتر یا کمتر از چیزی باشد که انتظارش را داشته اید و لزوماً چیزی نیست که می خواسته اید.
از دیدگاه برنامه نویسان ماژول، اطلاعات مفید است، زیرا به مشخص کردن یک خطا در داخل ماژول کمک می کند.
برای کاربر نهایی، اطلاعات ارائه شده نسبتا بی فایده است اما برای همه برنامه نویس سختگیر، کاملا بی فایده است.
راه حل برای چنین مشکلی، ماژول کارپ Carp module می باشد که یک روش ساده برای گزارش اشتباهات در ماژول هایی است که اطلاعات مربوط به اسکریپت تماس را ارائه می دهند.
ماژول کارپ دارای چهار تابع است : carp, cluck, croak و confess.
در ادامه آموزش مدیریت خطاها در پرل به بررسی این چهار تابع خواهیم پرداخت.
تابع carp معادل تابع warn است و پیام ها را بدون اسکریپت و پرینت نام اسکریپت به STDERR پرینت می نماید.
1 2 3 4 5 6 7 8 9 10 11 | package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp; sub function { carp "Error in module!"; } 1; |
هنگامی که از اسکریپت زیر استفاده می شود :
1 2 | use T; function(); |
نتیجه ای مانند نتیجه زیر خواهید داشت.
1 | Error in module! at test.pl line 4 |
تابع cluck یک نوع از supercharged carp است و همان اصولی را دنبال می کند که supercharged carp دنبال می نماید و stack trace یی از ماژول ها که منجر به فراخوانی تابع می شود را پرینت می نماید که شامل اطلاعات اصلی اسکریپت می شود.
1 2 3 4 5 6 7 8 9 10 11 | package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp qw(cluck); sub function { cluck "Error in module!"; } 1; |
هنگامی که از اسکریپت زیر استفاده می شود :
1 2 | use T; function(); |
نتیجه ای مانند نتیجه زیر خواهید داشت.
1 2 | Error in module! at T.pm line 9 T::function() called at test.pl line 4 |
تابع croak معادل تابع die است جز آن که یک فراخوان به سطوح بالا تر را گزارش می نماید.
درست مانند کاری که تابع die انجام می دهد تابع croak نیز بعد از گزارش خطا به STDERR اسکریپت را خارج می نماید.
1 2 3 4 5 6 7 8 9 10 11 | package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp; sub function { croak "Error in module!"; } 1; |
هنگامی که از اسکریپت زیر استفاده می شود :
1 2 | use T; function(); |
نتیجه ای مانند نتیجه زیر خواهید داشت.
1 | Error in module! at test.pl line 4 |
مانند تابع carp، قوانین اصلی مشابهی در رابطه با line خط و اطلاعات فایل file information با توجه به توابع die و warn وجود دارند.
تابع confess عملکردی مشابه با تابع cluck دارد.
این تابع، تابع die را فراخوانی کرده و stack trace را به تمام اسکریپت های اولیه پرینت می نماید.
1 2 3 4 5 6 7 8 9 10 11 | package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp; sub function { confess "Error in module!"; } 1; |
هنگامی که از اسکریپت زیر استفاده می شود :
1 2 | use T; function(); |
نتیجه ای مانند نتیجه زیر خواهید داشت.
1 2 | Error in module! at T.pm line 9 T::function() called at test.pl line 4 |
در این جلسه به آموزش مدیریت خطاها در پرل پرداختیم و به صورت مفصل انواع خطا ها و توابع لازم برای حل این خطا ها را مورد بررسی قرار دادیم.
در جلسه بعد، یعنی بیستمین جلسه از سری جلسات پرل به آموزش کار با مقادیر خاص در این زبان خواهیم پرداخت.
با پی وی لرن همراه باشید.