PDA

View Full Version : resume و resume next



Hossein Bazyan
یک شنبه 27 بهمن 1387, 21:57 عصر
سلام
قبلا در وی بی 6 دستورات resume و resume next داشتیم ایا معادلی در دات نت دارند یا خیر؟

Microsoft.net
دوشنبه 28 بهمن 1387, 12:19 عصر
این دستورات هم پشتیبانی میشوند ولی توصیه نمیشن ! ساختار Try ... Catch به عنوان جانشین شی گرای تشخصی خطا توصیه میشه

Hossein Bazyan
دوشنبه 28 بهمن 1387, 15:41 عصر
این دستورات هم پشتیبانی میشوند ولی توصیه نمیشن ! ساختار Try ... Catch به عنوان جانشین شی گرای تشخصی خطا توصیه میشه
سلام
منهم قبول دارم که این دستورات پشتیبانی میشوند اما من میخوام از try ... catch استفاده کنم طوریکه بتوانم اگر خطایی صورت گرفت از کل try خارج نشم بلکه برگردم به خط بعد از خطا.

دقیقتر بگم :
مثلا میخوام یکسری اطلاعات از بانک بخونم که شامل 20 فیلده حال در فیلد دهم بنا به دلایلی error میده و دستور try خط بعد از 10 رو حساب نکرده و کلا به finally پرش میکنه در حالی که میخوام از فیلد 11 به بعد را هم بخونه

Microsoft.net
دوشنبه 28 بهمن 1387, 21:55 عصر
خوب این یعنی داری برنامه ای مینوسی که توش ابهامه ! و این متناقضه با اصل شی گراییه. یا سناریو کد نویسیتو عوض کن یا مجبوری از همون دستور به اصطلاح کثیف resume next استفاده کنی
اگه خطی از برنامت Run time error داشته باشه بی معنیه که خط بعدی اجرا بشه و انتظار داشته باشی خروجی صحیحی تحویل بگیری چرا که اگه رویه مناسبی رو برای کد نویسی استفاده کرده باشی قطعا هر خط کدت داره یک وظیفه ای رو انجام میده و حتما یک جایی داری از نتیجه عملیات اون خط کد استفاده میکنی و گرنه اون خط کدت کلا اضافیه و باید حذفش کنی !!
من فکر میکنم سناریوی کد نویسیتو یک بازنگری بکن

Hossein Bazyan
دوشنبه 28 بهمن 1387, 23:31 عصر
خوب این یعنی داری برنامه ای مینوسی که توش ابهامه ! و این متناقضه با اصل شی گراییه. یا سناریو کد نویسیتو عوض کن یا مجبوری از همون دستور به اصطلاح کثیف resume next استفاده کنی
اگه خطی از برنامت Run time error داشته باشه بی معنیه که خط بعدی اجرا بشه و انتظار داشته باشی خروجی صحیحی تحویل بگیری چرا که اگه رویه مناسبی رو برای کد نویسی استفاده کرده باشی قطعا هر خط کدت داره یک وظیفه ای رو انجام میده و حتما یک جایی داری از نتیجه عملیات اون خط کد استفاده میکنی و گرنه اون خط کدت کلا اضافیه و باید حذفش کنی !!
من فکر میکنم سناریوی کد نویسیتو یک بازنگری بکن
سلام
دوست عزیز منهم میدانم اینا رو اما بعضی جاها واقعا لازم میشه که خط دارای اشتباه مادیده گرفته بشه و کنترل برنامه به خط بعدی بره !
یعنی هیچ راهی نداره ؟

علیرضا مداح
سه شنبه 29 بهمن 1387, 09:49 صبح
سلام دوست عزیز،

دقیقتر بگم :
مثلا میخوام یکسری اطلاعات از بانک بخونم که شامل 20 فیلده حال در فیلد دهم بنا به دلایلی error میده و دستور try خط بعد از 10 رو حساب نکرده و کلا به finally پرش میکنه در حالی که میخوام از فیلد 11 به بعد را هم بخونه
از چه روشی برای خواندن این اطلاعات بهره می گیرید؟
لطفا" کد این قسمت را در اینجا قرار دهید، چون این سناریو را می توان با Try--Catch--Finally یا Nested Try-Catch-Finally حل نمود، اما پیش از آن باید روش خود برای خواندن اطلاعات این 20 فیلد را ذکر نمایید،

در ضمن کلیدواژه Resume در VB.Net نیز پشتیبانی میشود(اما استفاده از آن توصیه نمی شود)
مثال هایی از MSDN:


Sub ResumeStatementDemo()
On Error GoTo ErrorHandler ' Enable error-handling routine.
Dim x As Integer = 32
Dim y As Integer = 0
Dim z As Integer
z = x / y ' Creates a divide by zero error
Exit Sub ' Exit Sub to avoid error handler.
ErrorHandler: ' Error-handling routine.
Select Case Err.Number ' Evaluate error number.
Case 6 ' "Divide by zero" error.
y = 1 ' Sets the value of y to 1 and tries the calculation again.
Case Else
' Handle other situations here....
End Select
Resume ' Resume execution at same line
' that caused the error.
End Sub



Public Sub OnErrorDemo()
On Error GoTo ErrorHandler ' Enable error-handling routine.
Dim x As Integer = 32
Dim y As Integer = 0
Dim z As Integer
z = x / y ' Creates a divide by zero error
On Error GoTo 0 ' Turn off error trapping.
On Error Resume Next ' Defer error trapping.
z = x / y ' Creates a divide by zero error again
If Err.Number = 6 Then
' Tell user what happened. Then clear the Err object.
Dim Msg As String
Msg = "There was an error attempting to divide by zero!"
MsgBox(Msg, , "Divide by zero error")
Err.Clear() ' Clear Err object fields.
End If
Exit Sub ' Exit to avoid handler.
ErrorHandler: ' Error-handling routine.
Select Case Err.Number ' Evaluate error number.
Case 6 ' Divide by zero error
MsgBox("You attempted to divide by zero!")
' Insert code to handle this error
Case Else
' Insert code to handle other situations here...
End Select
Resume Next ' Resume execution at same line
' that caused the error.
End Sub

Hossein Bazyan
سه شنبه 29 بهمن 1387, 12:10 عصر
سلام
جناب مداح اونی که من ذکر کردم یه مثال بود. اما یه نمونه کد هم میذارم از روشی که خودم برای خوندن استفاده میکنم .
فرض بر اینه که ما گرید ویو داریم و کاربر با دابل کلیلک روی یک سطر فیلد ID که سطر اول را بر میدارد و در بانک جستجو میکند و فیلدی با شماره ID را پیدا و فیلدهای دیگر را بازیابی و روی فرم قرار میدهد. حال بنا به دلایلی در خواندن یکی از فیلدها - مثلا فیلد 4 دچار مشکل میشود ( مثلا فیلد قبلا اشتباه در یانک ذخیره شده و یا بنا به دلایلی معتبر نیست ) حال میخواهیم به جای این فیلد مقدار صفر روی فرم قرار بگیرد و بقیه فیلدها خوانده شوند.

شیوه استفاده از try برای این وضعیت به چه شکل میباشد؟



Dim InsertSql As String = ""
Dim calc_ID As Double = 0
Dim con As OleDbConnection
Dim dr As OleDbDataReader
Dim cmd As OleDbCommand
Try
With dgvCalculatie
If Trim(.CurrentRow.Cells(0).Value.ToString).Length = 0 Then
cmdSave.Text = "&Opslaan"
Exit Sub
End If
cmdSave.Text = "&Wijzigen"
calc_ID = .CurrentRow.Cells(0).Value
InsertSql = "SELECT * FROM Calculatie_Main WHERE ID=" & calc_ID
con = New OleDbConnection(basBazyan.GetProvider())
con.Open()
cmd = New OleDbCommand(InsertSql, con)
dr = cmd.ExecuteReader()
dr.Read()
lbl_MateriaalCode.Text = calc_ID
BedrijfsCode = dr("BedrijfsCode").ToString
cboKlant.Text = dr("BedrijfsNaam").ToString
txtAdres.Text = dr("BedrijfsAdres").ToString
txtPlaats.Text = dr("BedrijfsPlaats").ToString
txtContactPersoon.Text = dr("BedrijfsContactPersoon").ToString
'---------------------------------------------------------------- Calculatie
txtUitTeVoeren.Text = dr("CalculatieWerkLocatie").ToString
txtContactPersoon2.Text = dr("CalculatieContactPersoon").ToString
txtTelNmmer.Text = dr("CalculatieTelNummer").ToString
txtReferentieNr.Text = dr("CalculatieReferentieNummer").ToString
txtOmschrijving.Text = dr("CalculatieOmschrijving").ToString
'---------------------------------------------------------------- BasisMateriaal
cbo1_MateriaalSoort.Text = dr("BasisMateriaalSoort").ToString
txt1_Vloeroppervlak.Text = dr("BasisVloer").ToString
txt1_M2Prijs.Text = FormatCurrency(dr("Basism2Prijs").ToString)
txt1_TotaalPrijs.Text = FormatCurrency(dr("BasisTotaalPrijs").ToString)
txt1_ReparatieAantal.Text = dr("BasisReparatie").ToString
txt1_LitePrijs.Text = FormatCurrency(dr("BasisLiterPrijs").ToString)
txt1_TotaalReparatie.Text = FormatCurrency(dr("BasisTotaalReparatie").ToString)
txt1_Bijzonderheiden.Text = dr("BasisBijzonderheden").ToString

Me.GridViewsSetting4Edit(dgvAantaal.Name, lbl_MateriaalCode.Text)
Me.GridViewsSetting4Edit(dgvAanvul.Name, lbl_MateriaalCode.Text)
End With
Catch ex As Exception
MsgBox(ex.Message)
End Try

Microsoft.net
سه شنبه 29 بهمن 1387, 22:20 عصر
سلام
دوست عزیز منهم میدانم اینا رو اما بعضی جاها واقعا لازم میشه که خط دارای اشتباه مادیده گرفته بشه و کنترل برنامه به خط بعدی بره !
یعنی هیچ راهی نداره ؟

خوب از همون Resume next استفاده کن بره دیگه !

علیرضا مداح
چهارشنبه 30 بهمن 1387, 11:13 صبح
دوست عزیز، شما می توانید از ساختار Try-Catch-Finally برای این منظور استفاده نمایید و راه های متفاوتی نیز وجود دارد،
یک پیشنهاد:
یک متد جدید ایجاد نمایید که یک IDataReader و نام فیلد را از از ورودی گرفته و مقدار را به خروجی بازگرداند و در این متد از ساختار ذکر شده بهره گیرید: مانند:


Public Function GetValue(ByVal dataReader As IDataReader, ByVal fieldName As String) As Object
Dim result As Object = Nothing
Try
result = dataReader(fieldName)
Catch ex As Exception
'Do Something Here
result = String.Empty
Finally
'Do Something Here
End Try
Return result
End Function


حال مثلا" به جای خط زیر:


cbo1_MateriaalSoort.Text = dr("BasisMateriaalSoort").ToString

از کد زیر استفاده نمایید:


cbo1_MateriaalSoort.Text = GetValue(dr,"BasisMateriaalSoort").ToString

البته کد فوق یک مثال ساده می باشد و برای تطبیق با نیازهای پروژه شما باید تغییراتی در آن داده شود،
در این حالت اگر در خواندن مقدار هر یک از فیلد ها خطایی رخ دهد، در خواندن مقادیر بقیه فیلدها خللی وارد نمی شود،
در ضمن، در بلوک ّFinally می بایست شیء OleDbConnection را Close و Dispose نمایید تا همیشه از بسته شدن کانکشن با دیتابیس اطمینان حاصل نمایید، یا اینکه از ساختار Using بهره بگیرید تا پس از خارج شدن از این بلوک، شیء OleDbConnection به طور خودکار Dispose شود:


Using connection As New OleDbConnection("connectionString")
'Your Code Goes Here
End Using