سلام
گفتم مجدداً مقداری فضولی کنم و بحث خطا را ببندم! امیدوارم جنبه کمکش افزون باشد!
دستور Try و On Error برای گیر انداختن و رفع رجوع خطا است ولی چگونه میتوان یک خطا را پیش آورد؟
چرا باید برنامه نویس دستی خودش یک خطا به وجود آورد؟ مگر سری را که درد نمی کند ...؟!
جوابش میشود به همان علتی که کلاسس های خود دات نت خطا را به وجود می آورند! (خودم میدونم نمی خواد تشکر کنید خیلی جوابش کامل و جامع بود! :31:)
مثالی میزنم:
شما یک برنامه ساده محاسبه فاکتوریل نوشته اید و مثلاً آن را Dll کرده اید و به دوست شفیقتان برای استفاده تحویل داده اید! این دوست شفیق شما نامردی میکند و عدد منفی به ورودی تابع شما میدهد! (یاد آورم میشوم طبق قوانین شفیقانه زبان شیرین ریاضی فاکتوریل منفی تعریف نشده است) در نتیجه شما هم نامردی میکنید و در درون تابعات اگر عدد ورودی منفی بود یک خطای خوشکل و کاملاً به جا تحویلش میدهید.!
از شوخی گذشته معمولاً وقتی کدی مینویسید و کد شما در شرایط استاندارد مود نیازش استفاده نمیشود پسندیده است که شما خطایی مرتبط را به وجود آورید.
مثل همین فاکتوریل عدد منفی یا تابعی برای تبدیل تاریخ نوشته اید ولی استفاده کننده از کد شما عدد ماه را 13 میدهد! و....
از فلسفه وجودی که بگذریم شما میتوانید با کمک کلمه کلیدی Throw یک خطا را به وجود آوردید (برعکس Try که خطای به وجود امده را خفه میکرد!)
سینتکسش هم ساده است
Throw X
که X یک نمونه، وهله، (New شده) از کلاسس خطا است،
طبیعتاً هر کلاسسی موقع New شاید یک سری پارامتر از شما بگیرد که با کلاسس دیگر فرق دارد،
مثلاً کلاسس های خطا عموماً Message را میگیرند که با آن شما میتوانید پیغام توضیحی در مورد دلیل خطا را کاملاً به کنترلر در بیاوردید.
حتی میتوانید برای خطاهایی که در برنامه تان به وجود می آید و هیچ نمونه آماده ای در دات نت ندارند خودتان با وراثت از کلاسس System.Exception خطای سفارشی بسازید
مثلاً اگر من میخواستم تابع فاکتوریل را بنویسم این کد را مینوشتم:
در این مورد من از کلاسس خطای داخلی System.ArgumentOutOfRangeException استفاده کردم که مخصوص خطای خارج از محدوده بودن یکی از آرگومانهای ورودی است و آن عبارت String که به سازنده اش دادم یعنی "value" مخصوص این کلاسس خطا است و شامل نام پارامتر ورودی مشکل دار است، کلاسس فوق از این نام String ای برای ساخت پیغام خطا استاندارد استفاده میکند و متن پیغام میشود:کد:Public Shared Function Factorial(ByVal value As Integer) As Double
Select Case value
Case Is < 0
Throw New System.ArgumentOutOfRangeException("value")
Case Is > 170
Throw New System.OutOfMemoryException
Case 0, 1
Return 1.0#
End Select
'--------------------------------------------------
Dim ret As Double = 1.0#
Do
ret *= value
value -= 1
Loop While value > 1
Return ret
End Function
Specified argument was out of the range of valid values.
Parameter name: value
اگر در زمان New کردن کلاسس فوق من به جای "value" نام "AAA" را میدادم متن پیغام خطا میشد:
Specified argument was out of the range of valid values.
Parameter name: AAA
(این صرفاً برای نمونه بود و فقط مخصوص کلاسس مذکور است)
میتوان خطاهای تودرتوی پله ای نیز داشت، طوری که خطا خطای دیگر را سبب شود و همه به صورت ذنجیره وار حفظ شوند و...
سعی کنید کلاسس های خطای استاندارد و مخصوص پر استفاده را در دات نت بشناسید و در صورت نیاز به پرتاب یک خطا، از کلاسس با مسمایی برای این کار استفاده کنید (کاربر anvar.net در پست 69 خود لیست کلاسس های خطای معروف را آورده اند در نتیجه من دوباره کاری نمیکنم)
(تمام مطالب فوق برای C#.Net هم صادق است ولی در C#.Net کلمه کلیدی مورد نظر با حروف کوچک باید نوشته شود یعنی به شکل throw و در VB.Net فرقی ندارد ولی استانداردش با T بزرگ است)
حالا میگم یک حالی میدهد بعد از این همه صغرا و کبرا و قصه حسین کرد شبستری، یک نابغه کشف نشده ای بیاید و بگوید:
"من دستور Throw را درست مینویسم و New هم کرده و پارامترها را صحیح میدهم ولی نمیدانم چرا هر کاری میکنم باز کاپیوتر خطا می دهد!!!!" :18:
نتیجه اخلاقی آنکه این بار که با خطایی روبرو شدید به جای نگاه کردن به آن به چشم یک مزاحم، ببینید حرفش چیست و چه مطلبی را گوشزد میکند و علاوه بر اینها از چه نوع و چه کلاسسی است.
فکر کنم با پست های کاربر anvar.net و این پست مرجع خوبی در مورد خطا در دات نت نوشته شد!
در آخر اگر دوستان میبینند جسارتی میکنم و شوخی میکنم به صرف آن است که مطالب کسل کننده نشود و دوستان و سروران گرامی راحت تر و با حوصله بیشتری بتوانید جفنگیات مرا بخوانید! (شما به دل نگیرید برادر! حساب شده بید! :31:)
موفق و شاد و بدون خطا باشید. :10: