درس چهاردهم : استثناها و ارور هندلینگ – بخش دوم
درس چهاردهم : استثناها و ارور هندلینگ – بخش دوم (Try … Catch … End Try)
14-1 مقدمه
در درس قبل با یکی از روشهای ارور هندلینگ آشنا شدیم. روش OnErrorGoTo از روشهای قدیمی بوده و مربوط به ویژوال بیسیک 6 است. امروزه کمتر پیش می آید که برنامه نویسی سراغ این روش برود. به جای روش قبل روشی مدرن و جدیدتر برای ارور هندلینگ وجود دارد که در این درس به معرفی و توضیح آن میپردازیم.
روش Try … Catch … End Try روشی محبوب در شماری از زبانهای مهم برنامه نویسی میباشد که در هر زبان سینتکس متفاوتی دارد. اما روش کلی واحد و یکی است. (با فراگیری این درس در درک بلاک Try … Catch در زبان #C هم راحت تر خواهید بود).
14-2 Try … Catch … End Try
14-2-1 سینتکس Try … Catch … End Try
سینتکس کد به صورت زیر است:
Try
Statements …
Catch variable as Exception
Error handling codes …
End Try
اجازه دهید با مثال توضیح دهیم.
14-2-2 مثالی از Try … Catch … End Try
برنامه ای می نویسیم که موقع اجرا سن شخص را به عنوان ورودی بگیرد و با کم کردن این ورودی از 2016 سال تولد میلادی شخص را حساب و نمایش دهد. کد چنین برنامه ی ساده ای چنین خواهد بود (قبل از نگاه کردن به کد زیر سعی کنید خودتان با دانسته هایی که از درسهای قبلی آموخته اید برنامه را بنویسید)
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim x As Integer = InputBox("Enter your age: ") Dim y As Integer = 2016 - x MsgBox("Your b-Year is : " & y, vbOKCancel, "vbLearn") End Sub End Class
این برنامه را با ورودی صحیح اجرا میکنیم. خروجی به صورت شکل 1-14 خواهد بود:
شکل 1-14 (اجرا با ورودی صحیح)
خب تا اینجا همه چیز درست به نظر میرسد. اما اگر به جای ورودی صحیح یک ورودی غلط وارد کنیم چه؟ مثلا من نامم را به جای سنم وارد میکنم. در حالت دیباگ سیستم ارور اکسپشن نمایش میدهد (شکل 2-14) اما کاربری که برنامه را استفاده میکند نه از اکسپشن سر در می آورد و نه حتی با آن مواجه خواهد شد. زیرا او برنامه را در محیط ویژوال استدیو اجرا نخواهد کرد و از امکانات دیباگ بر خلاف شما بهره ای ندارد. اگر خود شما هم برنامه را خارج از محیط ویژوال استدیو و یا حالت معمولی اجرا کنید مانند کاربران عادی در برابر خطاها و برنامه های خود آسیب پذیر خواهید بود. در مثال بالا در صورت وارد کردن ورودی اشتباه برنامه هنگ میکند و ویندوز با اشکال مواجه میشود (بهتر است این را روی سیستم خود تست نکنید! )
شکل 2-14 (اجرا با ورودی غلط در حالت دیباگ)
برای حل این مشکلات باید برنامه نویس با روشهای ارور هندلینگ هر گونه خطای برنامه را پیشبینی و واکنش مناسب در هنگام بروز ارور را تعیین کند. حال به Try … Catch … End Try برگردیم.
سینتکس آن را در بالا دیدید. اجازه دهید مثال خود را درون این بلاک کد قرار دهیم. به کد زیر توجه نمایید:
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Try Dim x As Integer = InputBox("Enter your age: ", "vbLearn.blog.ir(Lesson 14)") Dim y As Integer = 2016 - x MsgBox("Your b-Year is : " & y, vbOKOnly, "vbLearn.blog.ir(Lesson 14)") Catch err As Exception MsgBox("خطا در ورودی داده", vbOKOnly, "vbLearn.blog.ir(Lesson 14)") End Try End Sub End Class
همانطور که توجه کردید در کد بالا، خطوطی که قبلا هم نوشته بودیم و تست کردیم را بین کلمه ی Try و Catch قرار دادیم. باقی کد را به شرح زیر بررسی میکنیم:
به کلمه ی Catch توجه کنید. این لغت یعنی قاپیدن یا گرفتن. در اینجا به عبارت دیگر مانند این است که ما به سیستم بگوییم "ارور را بگیر" بعد آن را در متغیر با نام دلخواه (من نام err را برای آن در نظر گرفتم) از نوع Exception ذخیره کن. سپس یک پیام دلخواه مینویسیم و بعد بلاک را مانند هر بلاک دیگری در ویژوال بیسیک میبندیم. برای بستن بلاک Try از عبارت کلیدی End Try استفاده میشود.
به این ترتیب، اگر کاربر ورودی اشتباه وارد کند، برنامه هنگ و کرش نمیکند. در عوض یک پیغام را نمایش میدهد و بسته میشود. کاربر هم متوجه ایراد کار میشود و خطای خود را در اجرای بعدی برنامه تصحیح میکند.
حتما این سوال برای شما پیش آمده که متغیر err به چه کار می آید؟ در واقع ذخیره کردن ارور در یک متغیر کاری کاملا اختیاری ست و ما میتوانستیم فقط کلمه ی Catch را بنویسیم:
Catch MsgBox("خطا در ورودی داده", vbOKOnly, "vbLearn.blog.ir(Lesson 14)") End Try
به همین راحتی.
حال دلیل ذخیره ارور در متغیر چیست؟ دلیل این است که با این کار میتوان از پیغام خطای رسمی زبان ویژوال بیسیک برای نمایش خطا ها استفاده کرد. کافی ست به جای تایپ یک پیغام خطای دلخواه به زبان فارسی در تابع MsgBox ، نام متغیری که ارور را در آن ذخیره کرده اید بنویسید و سپس خصیصه Message آن را صدا بزنید (به یاد داشته باشید برای صدا زدن متد ها و خصیصه ها از یک نقطه در مقابل هر آبجکت استفاده میکنیم). یعنی به جای "خطا در ورودی داده" بنویسیم err.Message به کد زیر توجه کنید:
Catch err As Exception MsgBox(err.Message, vbOKOnly, "vbLearn.blog.ir(Lesson 14)") End Try
کد بالا را تست و نتیجه را مشاهده کنید.
تمرین: برنامه ای بنویسید که دو عدد را باهم جمع کند و اگر هریک از دو ورودی با اشکال مواجه بود پیغام خطای مناسب نمایش دهد.