Try \ Catch
در روش ساختاری مقابله با استثناء از بلوکهای Try برای فعال کردن رسیدگی به استثناء استفاده میشود. یک بلوک Try متشکل از کلمه کلیدی Try است که بدنبال آن بلوک مربوط به استثناء قرار میگیرد. بلوک Try عباراتی را که میتوانند موجب استثناء شوند و عباراتی را که در صورت رخ دادن یک استثناء نباید اجرا شوند را در خود احاطه میکند, بلافاصله بعد از بلوک Try چند بلوک Catch قرار میگیرند (البته ممکن است هیچ بلوکی نیز وجود نداشته باشد). هر بلوک Catch تصریح کننده یک پارامتر استثناء است و نشان دهنده نوع استثنایی است که باید بلوک به آن رسیدگی کند. اگر پارامتر استثناء حاوی یک نام پارامتر اختیاری باشد, رسیدگی کننده Catch میتواند از آن پارامتر برای برقراری تعامل با یک شئ استثناء گرفتار شده استفاده کند.
بطور اختیاری میتوان از یک بلوک Catch بدون پارامتر استفاده کرد. در این صورت تمام استثناء ها گرفتار میشوند.
پس از بلوک Catch آخر, بلوک اختیاری Finally قرار میگیرد. این بلوک حاوی کدی است که صرفنظر از اینکه استثنائی رخ داده یا خیر همیشه اجرا میشود.
هنگامیکه متد فراخوانی شده در برنامه ای, یک استثناء تشخیص دهد یا اینکه CLR متوجه مشکلی شود, متد فوق یا خود CLR یک استثناء براه می اندازد. نقطه ای از کد برنامه که در آن استثناء رخ داده نقطه Throw نامیده میشود.
در صورتیکه در بلوک Try خطایی رخ دهد, بلوک به کار خود پایان داده و کنترل برنامه به اولین رسیدگی کننده Catch پس از بلوک Try منتقل میشود. پس از یافتن Catch مناسب با استثنای رخ داده, رسیدگی کننده های Catch باقی مانده در نظر گرفته نمیشوند. اگر هیچ استثنایی در یک بلوک Try رخ ندهد, CLR تمام بخشهای رسیدگی کننده به استثناء در بلوک فوق را کنار میگذارد و بعد از عبارت Try \ Catch اجرا میشود.
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
***** کردن استثناء ها :
برای گرفتن نوع استثناء ها میتوان متغیری از نوع Exception تعریف کرد سپس محتویات آنرا نمایش داد.
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در دستور بالا متغیر ex تمام استثناء هایی که توسط بلوک Catch گرفته میشوند را در خود نگه میدارد. با استفاده از عبارت Type در هر بلوک Catch میتوان نوع خطایی که باید گرفته شود را مشخص کرد.
Catch ex As System.IO.FileNotFoundException
با استفاده از دستور when میتوان بیشتر خطاها را ***** کرد
Catch ex As نوع استثناء when متغیر=?
Or
…………………………. When Err.number=?
هر دستور Try \ Catch میتواند یک دستور Finally نیز داشته باشد.اگر این بلوک وجود داشته باشد حتما اجرا میشود (حتی اگر هیچ خطایی رخ ندهد یا اینکه توسط دستور exit try از Try \ Catch خارج شده باشیم).
مثال : سرریز
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
دو کلاس مهم مشتق شده از کلاس مبنای System.Exception کلاسهای applicationexception و Systemexception هستند,
کلاس applicationexception یک کلاس مبناء است که برنامه نویس میتواند با بسط آن اقدام به ایجاد انواع داده استثناء با توجه به نیازهای برنامه خود بکند.
CLR اقدام به ایجاد Systemexceptionها میکند. این عمل میتواند در هر نقطه ای از اجرای برنامه رخ دهد. استثناءهای زمان اجرا از کلاس Systemexception مشتق میشوند. در واقع یکی از مزایای استفاده از سلسله مراتب کلاس استثناء این است که یک رسیدگی کننده Catch میتواند یک نوع خاصی از استثناء ها را گرفتار کند.
کلاس Exception
کلاس فوق دارای چند خصوصیت مهم است :
Message : این خاصیت پیغام خطایی مبنی بر یک شئ استثناء در خود ذخیره میکند. این پیغام میتواند پیغام پیش فرض با نوع استثناء یا پیغام تهیه شده باشد و با رخ دادن استثناء به سازنده شء Exception ارسال گردد.
Stacktraces : این خاصیت حاوی رشته ای است که نشاندهنده پشته فراخوانی متد میباشد. محیط اجرایی لیستی از تعداد فراخوانی های متد در خود نگهداری میکند. رشته Stack…. ارائه کننده لیست این متدها است که هنوز اجرای آنها در زمان رخ دادن استثناء به پایان نرسیده است.
Innerexception : بطور کلی از این خاصیت برای منحرف کردن شئ های استثناء گرفتار شده در کد استفاده میشود. (بیشتر در برنامه های کتابخانه کلاس استفاده میشود)
Helplink : مشخص کننده مکان فایل کمکی در ارتباط با مشکل رخ داده است. اگر چنین فایلی وجود نداشته باشد مقدار آن Nothing میشود.
Source : مشخص کننده نام برنامه ای است که در آن استثناء اتفاق افتاده است.
TargetSite : مشخص کننده متدی است که استثناء در آن رخ داده است.
GetBaseException : این متد با قابلیت تغییر, یک آدرس برای خطای اولیه که ایجاد شده است بازمیگرداند؛ یعنی خطایی که زنجیره ای از خطاها را باعث شده است. شئ بازگردانیده شده از نوع Exception است.
انواع خطاهای استاندارد
نوع خطاء Exception : نوع پایه Object : کلاس مبنا برای تمامی خطاها است
نوع خطاء SystemException : نوع پایه Exception : کلاس مبنا برای تمامی خطاهای ایجاد شده بوسیله CLR است.
نوع خطای IndexOutOfRange Exception : نوع پایه SystemException : زمانیکه اقدام به دسترسی به عنصری در یک آرایه میکنید که وجود ندارد این خطاء بوسیله CLR ایجاد میشود.
نوع خطای NullRefrence Exception : نوع پایه SystemException : در صورت اقدام به ارجاع به یک شئ بدون اعتبار این خطاء بوسیله CLR ایجاد میشود.
نوع خطای InValidOperation Exception : نوع پایه SystemException : این خطاء به وسیله متدی رخ میدهد که شئ متد در یک وضعیت بدون اعتبار است.
نوع خطای Argument Exception : یک نوع خطای کلاس مبنا برای تمامی خطاهای آرگومان است.
نوع خطای ArgumentNull Exception : نوع پایه ArgumentException : این خطاء زمانی بوسیله متدهای یک شئ رخ میدهد که یک مقدار Null برای یک آرگومان عرضه میکنید که این آرگومان اجازه نمیدهد آرگومان Nothing باشد.
نوع خطای ArgumentOutOfRange Exception : نوع پایه Argument Exception : زمانی بوسیله یک متد ایجاد میشود که یک یا چند آرگومان در محدوده معتبر قرار ندارند.
کلاسهای استثناء تعریف شده از سوی کاربر
در صورتیکه مایل به ایجاد انواع خاصی از کلاسهای باشیم که مشکلات خاص برنامه های ما را کنترل کنند میتوانیم استثناء های جدیدی تعریف کنیم. این استثناء ها بطور مستقیم یا غیر مستقیم از کلاس مبنای applicationexception مشتق میشوند.
استثناءهای تعریف شده از سوی کاربر باید :
از کلاس applicationexception بدست بیایند.
دارای یک نام کلاس باشند که در انتهای آن عبارت exception وجود داشته باشد و 3 سازنده در آن اعلان شود. 1 سازنده پیش فرض, 1 سازنده که یک آرگومان رشته ای (پیغام خطاء) دریافت کند و سازنده ای که یک آرگومان رشته ای و یک آرگومان exception (پیغام خطاء و شئ داخلی خطاء) دریافت نماید.
ایجاد خطای سیستم :
اگر بخواهیم یک خطای سیستم را شبیه سازی کنیم یکی از اعداد رزرو شده برای سیستم را استفاده میکنیم. یعنی باید متد Raise را با یکی از اعداد 0 و 512 فراخوانی کنیم.
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در صورتیکه روال فوق را مقدار 5 فراخوانی کنیم, خطای Invalid Procedure Call Or Argument ایجاد میشود, این خطاء معمولا زمانی رخ میدهد که تعداد آرگومانهای غلط را به روال انتقال میدهیم.
درصورتیکه بخواهیم یک خطاء ایجاد کنیم که خطای تعریف شده کاربری باشد, میتوان مقدار ثابت vbObjectError را به عدد خطاء اضافه کنیم.مقدار ثابت فوق -2147221504 است.
Err.Raise(vbObjectError + ExceptionNum)
برای تعیین خطای تعریف شده توسط کاربر یا تشخیص خطاهای سیستم از خطای کاربری باید ثابت vbObjectError را از خصوصیت Number سئ Err کم کنیم.
در صورتیکه مقدار بدست آمده عددی بین 0 و 65535 باشد خطای فوق یک خطای تعریف شده توسط کاربر است در غیر اینصورت خطا یک خطای سیستم Vb است.