PDA

View Full Version : سوال: مدیریت خطا در برنامه



mc_laren
شنبه 02 مرداد 1389, 14:44 عصر
با عرض سلام و خسته نباشی
دوستان حتما تا حالا با مدیریت خطاهای رخ داده در برنامه زیاد کار کرده اند و با Try Catch کار کرده اند .
من یک برنامه تجاری می نویسم و اصلا هم دوست ندارم برنامه ام بخاطر یک خطای کوچک از کار بیافتد . و برای اینکار برای تمام کارهایم یک Try Catch قرار داده ام ، به گونه ای که فکر کنم تعدادشون از هزار هم رد کرده باشه
می خواستم بدون آیا خود ویژوال استادیو تنظیماتی برای مدیریت خطا نداره که هر وقت خطایی در برنامه رخ داد دستوراتی که ما براش مشخص کرده ایم انجام شود مثلا من خودم در Try Catch هایم خود پیغام خطا و خطی که خطا در آن رخ داده را برای کاربر چاپ می کنم.
راستی یک سوال دیگه داشتم چطوری میشه برای برنامه ام یک فایل Log درست کنم تا هر وقت خطا رخ داد اطلاعات خطای رخ داده درونش نوشته شود.
با تشکر

Saman_12
شنبه 02 مرداد 1389, 14:54 عصر
خدمتتون عرض کنم که من یک سال پیش ویروس مینوشتم وبرای اینکه هیچ خطایی زمان اجرای برنامه رخ نده اول هر رویدادی که مینوشتم این کدو اظافه میکردم شاید به کار شما هم بیاد! :لبخند:

On Error Resume Next
در مورد log هم اطلاعی ندارم!!!

DoDoklak
شنبه 02 مرداد 1389, 16:33 عصر
بهتره یک فرم برای تولید خطا بزاری تا کاربر در صورت برخورد با اون اونو برای شما گزارش کنه.دقیقا به همون شیوه ایی که مایکروسافت هم بهش عمل میکنه
من خودم از نمونه زیر استفاده میکنم

http://aks98.com/images/1x52zo4ae1j2kuys5rgz.png

ashkan209
شنبه 02 مرداد 1389, 18:11 عصر
بهتره یک فرم برای تولید خطا بزاری تا کاربر در صورت برخورد با اون اونو برای شما گزارش کنه.دقیقا به همون شیوه ایی که مایکروسافت هم بهش عمل میکنه
من خودم از نمونه زیر استفاده میکنم

http://aks98.com/images/1x52zo4ae1j2kuys5rgz.png

روش کارتون جالبه
اما نگفتید چکونه پیاده سازی کردین؟

DoDoklak
شنبه 02 مرداد 1389, 19:40 عصر
ساده هستش

طراحی فرم که کاری نداره

جهت متن خطا هم از روش زیر استفاده کردم



Try

دستورات برنامه

Catch ex As Exception
GetError(ex.Message & vbCrLf & vbCrLf & ex.StackTrace, "DefineCostKala", "BtnDelKala_Click")
End Try


تو بخش Catch یک تابع رو فراخونی کردم همراه با پارامترهاش که مشخص میکنه چه فرمی هستش و چه پیغامی

این سورس تابع GetError که فرم را فراخوانی میکنه


Public Sub GetError(ByVal Err As String, ByVal Frm As String, ByVal Loc As String)
Using Ferror As New FrmError
FrmError.TxtError.Text = " " & vbCrLf & Frm & vbCrLf & vbCrLf & " " & vbCrLf & Loc & vbCrLf & vbCrLf & " " & vbCrLf & Err
FrmError.ShowDialog()
End Using
End Sub

ricky22
شنبه 02 مرداد 1389, 19:50 عصر
بهتره یک فرم برای تولید خطا بزاری تا کاربر در صورت برخورد با اون اونو برای شما گزارش کنه.دقیقا به همون شیوه ایی که مایکروسافت هم بهش عمل میکنه
من خودم از نمونه زیر استفاده میکنم

http://aks98.com/images/1x52zo4ae1j2kuys5rgz.png
خوب نیست
کاربر که نباید درگیر این چیزا شه
من ارور ها رو کد بندی می کنم
در ضمن همه ی کد هم در Try catch نمی زارم کدی که ممکن باعث خطا شه فقط

mc_laren
یک شنبه 03 مرداد 1389, 06:26 صبح
من که تو سوالم گفته بودم خودم دارم از Try Catch استفاده می کنم و گفتم نمی خوام برای هر قسمت برنامه یک Try Catch قرار بدم .

ricky22
یک شنبه 03 مرداد 1389, 07:55 صبح
من که تو سوالم گفته بودم خودم دارم از Try Catch استفاده می کنم و گفتم نمی خوام برای هر قسمت برنامه یک Try Catch قرار بدم .
ببینید Try Catch روش استاندارد مدیریت خطا و استثنا هست.
دلیلی نداره که نخواید از اون استفاده کنید.
اما باید صحیح استفاده کنید.
در غیر این صورت باید از IF های زیاد و روش سنتی On error goto و ... استفاده کنید که باز هم همه ی حالات رو نمی تونید handle کنید.
اینجا (http://weblogs.asp.net/memi/archive/2004/05/13/131244.aspx)نویسنده نظرش رو درباره زمانهای استافده از Try catch نوشته :

1.

When a special action is required for this specific exception, eg. closing connection to the database.
2. When the original exception should be replaced / wrapped in another, maybe friendlier, exception.
In any other case, no such block is necessary. The generic handler will take care of it
.

جالبه که اینجا (http://codebetter.com/blogs/karlseguin/archive/2010/01/25/don-t-use-try-catch.aspx)نویسنده گفته از Try catch استفاده نکنید.
موفق باشید.

DoDoklak
یک شنبه 03 مرداد 1389, 09:26 صبح
کاربر که نباید درگیر این چیزا شه


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

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

اکثر نرم افزارهای ایرانی خطاهای برنامه رو نشون نمیدن و یه جورهایی ردش میکنن تا کاربر نبینه و ازشون ایراد نگیرن ولی این روش اشتباه است

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

چون به احتمال زیاد بعد از خطا بخش های بعدی کد به درستی عمل نکنن



من ارور ها رو کد بندی می کنم


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



در ضمن همه ی کد هم در Try catch نمی زارم کدی که ممکن باعث خطا شه فقط


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

در ضمن Try Catch بار سنگینی به سیستم وارد نمیکنه که بخوای ازش استفاده نکنی
اگر سورس یک بخش هم زیاد باشه میتونید از چند تا Try Catch به صورت اصولی استفاده کنید

Mani_rf
یک شنبه 03 مرداد 1389, 09:48 صبح
بهتره یک فرم برای تولید خطا بزاری تا کاربر در صورت برخورد با اون اونو برای شما گزارش کنه.دقیقا به همون شیوه ایی که مایکروسافت هم بهش عمل میکنه
من خودم از نمونه زیر استفاده میکنم

http://aks98.com/images/1x52zo4ae1j2kuys5rgz.png

به نظر من هم این خیلی روش جالب و شیکی که به کار گرفتی ، البته به نظرم این روش به درد برنامه های کوچک نمی خوره، به کار برنامه هایی میاد که یک گروه پشتیبانی همیشه با مشتری در ارتباط باشن ، درسته؟
اما فکر میکنم برای جاهایی که بروز خطا خللی در برنامه ایجاد نمی کنه ، مثلا تقسیم عدد بر صفر ، فرمان On Error Resume Next خیلی بهتر و سریع تره تا Try , Catch

DoDoklak
یک شنبه 03 مرداد 1389, 11:33 صبح
به نظر من هم این خیلی روش جالب و شیکی که به کار گرفتی ، البته به نظرم این روش به درد برنامه های کوچک نمی خوره، به کار برنامه هایی میاد که یک گروه پشتیبانی همیشه با مشتری در ارتباط باشن ، درسته؟

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

ولی میتونه برای برنامه های کوچک هم کاربرد داشته باشه
چون برنامه های کوچک خالی از خطا نیستند و خدمات پشتیبانی احتیاج دارن



اما فکر میکنم برای جاهایی که بروز خطا خللی در برنامه ایجاد نمی کنه ، مثلا تقسیم عدد بر صفر ، فرمان On Error Resume Next خیلی بهتر و سریع تره تا Try , Catch


این مشکلات رو میشه با پیغام فارسی حل کرد نیازی به گزارش خطا نیست
ولی زمانی که شما تو کدتون اونو بررسی نکرده باشین به عنوان خطا گزارش داده میشه

ولی بازم بهتره به جای رد کردن خطا به کاربر هشدار بدید

مثل ماشین حساب ویندوز
خیلی راحت ویندوز میتونه خطا رو رد کنه ولی به کاربر پیغام میده که اشتباه کرده

http://aks98.com/images/8ci44rf9io1xrnbiihdo.png

hero4000
یک شنبه 03 مرداد 1389, 12:20 عصر
اساتيد محترم ببخشيد يک راهي چيزي نيست که بشه هر دو تا راه رو انجام داد مثلا بگيم On Error Resum Next بعد اين ارور اتوماتيک به يک جايي ارسال بشه مثلا يک فايل لوگ

نميدونم منظورم رو درست گفتم يا نه

مثلا اول هر بلوک بنويسيم On Error Resum ... بعد توي اين بلوک هر جا خطا خورد خطا رو گزارش بده و اتوماتيک به خط بعدي بره يعني برنامه توي اون بلوک متوقف نشه

Saman_12
یک شنبه 03 مرداد 1389, 12:59 عصر
اگه کل کد های یک بلوک رو در یک ساختار Try , Catch , Finally قرار بدیم و بشه کاری کرد که از خط Error به بعد به همراه یک ساختار دیگر Try , Catch , Finally در Finally ساختار Try , Catch , Finally اول قرار بگیره اون وقت کاری که hero4000 می خوان انجام بدن شدنیه! :کف:
اما سوال اینجاست که این کار رو میشه انجام داد یا نه؟ :متفکر:

hero4000
یک شنبه 03 مرداد 1389, 17:02 عصر
:گیج: :گیج:

Saman_12
یک شنبه 03 مرداد 1389, 21:45 عصر
حق داری فکر کنی گیج میزنم!:تشویق:
آخه یکم فکر کردم دیدم گیرم کاری که گفتم شدنی باشه پس حجم برنامه در زمان اجرا تغییر میکنه که این غیر ممکنه!:اشتباه:
درضمن اگه از دستور On Error Resume Next استفاده کنی حتی اگه به Error برخورد کنی برنامه اونو نادیده می گیره و بقیه کد اجرا میشه پس اینکه بتونی خطا رو گزارش کنی غیر ممکنه!:گیج: