PDA

View Full Version : مدیریت خطا در حلقه ها



ncs2008
دوشنبه 16 خرداد 1390, 02:09 صبح
سلام اساتید محترم
من یه کد دارم مثل کد زیر من عمدا یکی از خانه های آرایه را رشته کردم،در حلقه وقتی به خانه دوم آرایه می رسد خطا می دهد و برنامه متوقف می شود.خوب حالا من می خوام اگه به خطا رسید فقط آن بخش را ادامه دهد و آنهایی که درست هستند را چاپ کند یعنی در خروجی کد زیر 1و2 را چاپ کند.
کسی میتونه راهنمایی کنه چطوری می شه از خطای داخل حلقه چشم پوشی کرد،دوستانی که لطف می کنن جواب می دهتد یه لطف بکنن تست کنن تستش هم حیچ وقت گیر نیست فقط یه کلید روی فورم و نوشتن کد ها داخل کلید چون من از خیلی سایتها پرسیدم ولی هیچکدام درست نبود
ممنون از همه ی دوستان که کمک می کنند
کد:


Dim i As Integer
a(1) = 1
a(2) = "b"
a(3) = 3
For i = 1 To 3
Dim Eg As Graphics = Me.CreateGraphics
Eg.DrawString(i, New Font("B Titr", 20, FontStyle.Bold, GraphicsUnit.Pixel), Brushes.Red, 5, 50 * i)
Next i

roxe77
دوشنبه 16 خرداد 1390, 02:31 صبح
Try
'Code i ke Momkene Khata bede
Catch ex As Exception
'Axol amali ke Moghe Khata broz Mide Albate mitone Khali ham bashe
End Try

ncs2008
دوشنبه 16 خرداد 1390, 02:48 صبح
Try
'Code i ke Momkene Khata bede
Catch ex As Exception
'Axol amali ke Moghe Khata broz Mide Albate mitone Khali ham bashe
End Try
=====================
ممنون دوست عزیز از پاسختون
اما من اینو چک کرده بودم و باعث میشه هیچی چاپ نشه یعنی 1و2 که درست هست هم و ازنتوع عددی آن ها را هم چاپ نمی کند
من میخوام فقط گزینه b که خطا می دهد را چشم پوشی کنه بره 2 را که درست است چاپ کند.
شما اگه به جای b عدد بزارین به درستی 1و2و3 چاپ می کند.
راه حله دیگه ای به نظرتون میرسه دوست عزیز

roxe77
دوشنبه 16 خرداد 1390, 10:34 صبح
Try
'Code i ke Momkene Khata bede
Catch ex As Exception
'inja oon dastori ke chap mikone ro bezar va gozineii ke khate mide ro hazf kon ya hamon b ro !! mitoni bejash 1 chiz dige bezari

End Try

Saman_12
دوشنبه 16 خرداد 1390, 12:09 عصر
کد شما درست هست و خطایی ایجاد نمیکنه!!
اما برای رد شدن از خطا و ادامه اجرا کد ها می تونید از دستور زیر در بالای قسمتی که خطا ایجاد میکند یا مشکوک به ایجاد خطا هست استفاده کرد :
On Error Resume Next
پس کد شما اینجوری میشه(البته مشابه اون هست تا خطا ایجاد کنه ,توضیحات هر خط رو مقابلش به صورت خلاصه نوشتم تا مشکلی پیش نیاد) :
Private Sub testErrnext()
On Error Resume Next 'موجب نادیده گرفتن خطا میشود

Dim si(2) As String, ni As Integer 'تعریف دو متغییر برای ایجاد خطا مقدار رشته در صورت عدد نبودن خطا ایجاد میکند
Dim ar As New ArrayList ' تعریف یک آرای لیست برای آفزودن اعضاء

si(0) = 1 : si(1) = "a" : si(2) = 3 'مقدار دهی آرایه از نوع رشته و عدد

For i As Integer = 0 To si.Length - 1 'ایجاد حلقه برای خواندن خانه های آرایه

ni = Val(si(i)) 'متغییر عددی خانه دارای مقدار خانه آرایه می شود
If Not ni = 0 Then ar.Add(ni) 'اگر مقدار متغییر غیر عددی باشد و خطا ایجاد شده باشد متغییر مقدار صفر را دادرد _
'چک کردن مقدار و اظافه کردن ان به یک آرای لیست
Next

For Each item As Object In ar 'ایجاد حلقه برای خواندن اعضاء اظافه شده به آرای لیست

MsgBox(item)
Next
End Su

البته بهتره از این به بعد اول جستجو کنید بعد اگر به نتیجه نرسیدین تایپیک جدید ایجاد کنید!:لبخندساده:

ncs2008
دوشنبه 16 خرداد 1390, 12:10 عصر
دوست عزیز این کدی که شما می نویسید فقط باعث می شود هیچ چیزی چاپ نشود.
شاید من نتونستم منظورم را واضح بیان کنم.
من می خوام زمانی که از b در خانه 2 آرایه خطا گرفت ازش چشم چوشی کند و برود ادامه حلقه و آنهایی که
محتواشان درست است را انجام دهد.یعنی برای من 1و3 را روی فرم چاپ کند من اگه به جای b بزارم 2 برام روی فرم 1و2و3 چاپ می کند.
کسی از اساتید محترم تا حالا این مشکل براش پیش نیامده فکر می کنم در خیلی از حلقه ها ممکنه این مشکل باشه.دوستان نظری،پیشنهادی ندارند.
help meeeeeeeeeeeeee

ncs2008
دوشنبه 16 خرداد 1390, 12:21 عصر
ممنون سامان جان من این On Error Resume Next را دیده بودم فقط اشتباهی که می کردم داخل حلقه for میزاشتم من این کد را در برنامه به صورت زیر نوشتم این دفعه خطا را نادیده می گیرد ولی خودش به جای اینکه b را نادیده بگیرد و چیزی چاپ نکند خودکار 2 را چاپ می کند خروجی می شود 1,2,3 در حالی که باید بشود 1و3 چرا؟
میشه یه کاری کرد فقط 1و3 را چاپ کند و bکه خطا می گیرد را رد کند و هیچ چیزی به جاش چاپ نکند.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
On Error Resume Next
Dim i As Integer
a(1) = 1
a(2) = "b"
a(3) = 3
For i = 1 To 3

Dim Eg As Graphics = Me.CreateGraphics
Eg.DrawString(i, New Font("B Titr", 20, FontStyle.Bold, GraphicsUnit.Pixel), Brushes.Red, 5, 50 * i)
Next i

End Sub

ncs2008
دوشنبه 16 خرداد 1390, 12:41 عصر
خوب به اون چیزی که می خواستم رسیدم با یه کمی ور رفتن با برنامه مشکل این بود که من شماره آرایه را می دادم با ید محتوای آری را می دادم.

Saman_12
دوشنبه 16 خرداد 1390, 12:54 عصر
من که گفتم کد شما مشکلی ندارد اما برای این کار ,شما باید مقدار های متغییر a را رسم کنید نه از عدد 1 تا 3 :
Private Sub DrawEG()
On Error Resume Next

Dim Eg As Graphics = Me.CreateGraphics
Dim ni, ni1 As Integer
Dim a(2) As String

a(0) = 1 : a(1) = "b" : a(2) = 3

For i As Integer = 0 To a.Length - 1 'a.Length -1 = 2

ni = a(i)

If Not ni = ni1 Then _
Eg.DrawString(ni, New Font("B Titr", 20, FontStyle.Bold, GraphicsUnit.Pixel), Brushes.Red, 5, 50 * ni) ' اگر خطا ایجاد شود متغییر مقدار قبلی را خواهد داشت

ni1 = ni
Next

Eg.Dispose()
End Sub

کد زیر همان کار را با استفاده از Try انجام میده :
Private Sub DrawEG1()

Dim Eg As Graphics = Me.CreateGraphics
Dim ni As Integer
Dim a(2) As String

a(0) = 1 : a(1) = "b" : a(2) = 3

For i As Integer = 0 To a.Length - 1 'a.Length -1 = 2

Try

ni = a(i)
Eg.DrawString(ni, New Font("B Titr", 20, FontStyle.Bold, GraphicsUnit.Pixel), Brushes.Red, 5, 50 * ni)
Catch ex As Exception
'Next error
End Try
Next

Eg.Dispose()
End Sub
اگر شما میخواهید عدد بودن مقدار رو چک کنید بهتره از تابع IsNumeric استفاده کنید.
موفق باشید.