PDA

View Full Version : سوال در رابطه با ساختمان Try .. Catch ...End try



vahidiran
یک شنبه 15 بهمن 1385, 12:17 عصر
از کد زیر یرای مدیرت خطا استفاده کرده ام

Try
Button2.Enabled = False
Timer1.Enabled = True
Catch ErrReport As Exception
MsgBox(ErrReport.Message)
End Try

این خیلی خوبه و اطلاعات خطا رو هم می ده ولی اگه بخواهم دوباره اجرای برنامه از کد بعد از خطا شروع شه
چکار باید کرد مثل کاری که در VB6 می کردیم


On Error Resume Next

zerobit-ltd
یک شنبه 15 بهمن 1385, 13:00 عصر
تو ساختار try ... catch باید دستوراتی که می خواید بعد از گیر انداختن خطا اجرا بشن رو تو قسمت finally قرار بدید.


Try
.
.
.
Catch Error As Exception
.
.
.
Finally
End Try

توجه داشته باشید که دستورات قسمت Finally در هر صورت اجرا می شن. چه خطا رخ بده، چه رخ نده.
در ضمن تو VB.NET هنوز می تونید از On Error Goto استفاده کنید؛ ولی خوب استفاده از این ساختار توصیه نمی شه.

leilav_1984
یک شنبه 15 بهمن 1385, 13:35 عصر
اگه بخواهم دوباره اجرای برنامه از کد بعد از خطا شروع شه
چکار باید کرد

خب خطایی که تو try-catch
handle بشه مزاحم ادامه اجرا نمیشه و برنامه به خط بعد از End Try می ره
ولی اگه منظور اینه که برگرده و ادامه try رو انجام بده به نظر من صحیح نیست چون ممکنه خطای واقع شده در خطوط قبلی باعث اشتباه در اجرای ادامه Try بشه
مثلا یه مقدار یه متغیر Null شده باشه و ...

vahidiran
یک شنبه 15 بهمن 1385, 19:38 عصر
فقط من می خوام خطی که خطا داره اجرا نشه مثل همون دستوری که نوشتم
وFinally رو می دونم در واقع که من نمی دونم که در کدوم خط خطا می شه تا بقیه شو توی Finally بنویسم
finally برای زمانی هستش که بخواهید یه منبع رو آزاد کنید

meh_secure
دوشنبه 16 بهمن 1385, 00:54 صبح
ساختار Try..Catch رو بطور کامل بررسی کنید. از دستور Exit Try هم برای مدیریت بهتر می تونید استفاده کنید.

Ner'zhul Arthas
دوشنبه 16 بهمن 1385, 02:10 صبح
میتونید توی چندتا Try Catch بذارید.
حالا چرا از On Error Resume Next استفاده نمیکنید؟

اگر به خاطر امکان اطلاع دادن از خطاست این کار رو کنید:



Private Sub ...
On Error GoTo Err1
'code
'code
'code
'code
'code
'code
Exit Sub
Err1:
MsgBox(Err.Description)
Resume Next
End Sub

vahidiran
دوشنبه 16 بهمن 1385, 09:51 صبح
میتونید توی چندتا Try Catch بذارید.
حالا چرا از On Error Resume Next استفاده نمیکنید؟

اگر به خاطر امکان اطلاع دادن از خطاست این کار رو کنید:



Private Sub ...
On Error GoTo Err1
'code
'code
'code
'code
'code
'code
Exit Sub
Err1:
MsgBox(Err.Description)
Resume Next
End Sub


حالا اگر کد من 50 خط باشه دیگه برنامه ام می شه یه بشقاب اسپاگتی
برای این از try استفاده می کنم که توضیح خطا رو هم بده

titbasoft
دوشنبه 16 بهمن 1385, 10:34 صبح
برای این از try استفاده می کنم که توضیح خطا رو هم بده

آبجکت Err همچنان موجوده

On Error Resume Next

Dim a, b, c As Int16
a = 1
b = 0
c = a / b
If Err.Number <> 0 Then
MsgBox(Err.Description)
Err.Clear()
End If

Ner'zhul Arthas
دوشنبه 16 بهمن 1385, 14:22 عصر
Private Sub ...
On Error GoTo Err1
'code
'code
'code
'code
'code
'code
Exit Sub
Err1:
MsgBox(Err.Description)
Resume Next
End Sub

به Resume Next که در کد بالا بود دقت کردید؟
آیا این مشکل شما رو حل نمیکنه؟
چیزی غیر از این میخواید؟

meh_secure
سه شنبه 17 بهمن 1385, 00:11 صبح
try
.
.
.
catch ex as exeption.
if ex.message=.... then .....
.
.
end try

می توانید در صورت بروز خطای خاصی کاری را انجام دهید و ...

منصور بزرگمهر
سه شنبه 29 مرداد 1387, 07:06 صبح
کسی جواب پیدا نکرد؛ نیاز است. معادل دستور Resume در بلوک try Cache End try چیست.

Microsoft.net
سه شنبه 29 مرداد 1387, 19:17 عصر
کسی جواب پیدا نکرد؛ نیاز است. معادل دستور Resume در بلوک try Cache End try چیست.


همچین عبارت Throw یعنی چه؟

Throw یک exception رو اصطلاحا پرت میکنه به لایه بالا تر . به طور مثال اگر خطایی در لایه DataAccess شما رخ بده با این دستور خطا به لایه Biz شما پرت میشه و با یک Throw دیگه در لایه Biz خطا به لایه UI شما منتقل شده و در اونجا به کاربر نمایش داده میشه . که اگر از منطق چند لایه ای (N-Tier) استفاده نکردید به کارتون نمیاد.
در مورد چیزی که میخواهید چون اصولا مایکروسافت بر طبق رویه چند ساله اخیرش سعی کرده به برنامه نویسایی که از محصولاتش استفاده میکنن سمت و سوی خاص و مشترکی رو بده و در واقع اونها رو مجبور کنه از اصول شی گرایی و Pattern های مشترکی پیروی کنند تا بتونه در آینده محصولات رو با تغییرات بیشتری و راحت تر بفروش برسونه لذا این چیزی که مد نظرت هست خوشبختانه! پشتیبانی نمیشه توسط Try Catch . دلایل زیادی هم میتونه داشته باشه از جمله اینکه تکه برنامه ای که Run time error داشته باشه از لحاظ منطقی مشکل داره و باید اصلاح بشه و ادامه کار اون اصطلاحا ریسک پذیری بالایی داره . حالا ممکنه شما بگید که نه اینجوری نیست و یک توجیه شخصی برای اون بیارید که جوابتون فقط یک جمله هست و اون اینکه تکه کدتون رو از لحاظ منطقی بازبینی کنید چرا که به نظر من یه جای منطق برنامه ات اشکال داره . در واقع کد برنامت اگه خطای منطقی نداره که هیچ و اگه داره باید حتما رفع بشه و این طرز فکر که اگه برنامه ام اشکال داشت بیخیال برو جلو ! رو سعی کن از ذهنت دور کنی که در دنیای حرفه ای مهندسی نرم افزار جایی نداره .
از جوابی هم که به اون دوستی که گفته بود چرا از On error resume next استفاده نمیکنی دادی معلوم هست که ذهن آماده ای برای پذیرش شی گرایی داری . سعی کن همیشه همینجوری با دید انتقادی به مشکلات نگاه کنی مطمین هستم به جواب درست خواهی رسید . یکی از بزرگترین مشکلات اکثر برنامه نویسا اینه که ذهنشون آماده شی گرایی نیست و با کوچکترین انتقادی سریع موضع گیری متعصبانه ای میکنند و حاظر به پذیرش واقعیات روز دنیای برنامه نویسی نیستند .

منصور بزرگمهر
چهارشنبه 03 مهر 1387, 21:42 عصر
دستور goto را می توان بجای resume بکار برد. در واقع برگشت به خط Err اتفاق افتاده است که با این دستور امکان پذیر است. شاید دوستان ایراد بگیرند دستور goto دستور توصیه نشده است، ولی خود err نیز یک انشعاب ناخواسته است، و با یک انشعاب دیگر می توان به روال عادی برنامه برگشت.

fariba-2
جمعه 26 تیر 1394, 11:33 صبح
سلام
این سوال معلومه مال خیلی سال پیشه.
ولی خوب سوال منم الان تقریبا تو همین زمینه است ولی سطح پایینتر
بخش finally رو نمیدونم کجای برنامه ام بنویسم.
باید try-catch جدید درست کنم؟
وقتی زیر قبلیا مینویسم سیستم قبول نمیکنه.
private
void btndiv_Click(object sender, EventArgs e)
{

try
{
txtresult.Text = (
Convert.ToInt32(txtnum1.Text) / Convert.ToInt32(txtnum2.Text)).ToString();
}

catch (System.FormatException a)
{
txtresult.Text = a.Message;
}

catch (System.DivideByZeroException b)
}

finally
{
txtresult.Text =
Convert.ToInt32(txtnum2.Text).ToString();

میخوام بعد از گرفتن خطاهای قبلی حالا در هر صورت وقتی دکمه محاسبه رو میزنی مثلا جمله تهران بیاد. با finally.
البته این برنامه رو کامل نکردم چون تا همینجاشم به finally که میرسه داره خطا میگیره.
ممنون میشم راهنماییم کنین.