PDA

View Full Version : Exception Handling برای برنامه های بزرگ



reza6384
دوشنبه 23 اردیبهشت 1387, 12:10 عصر
سلام.
من می خواستم راجع به یه موضوع بحث کنیم و نظر بدید.

برنامه هایی که تعداد فرم هاش زیاده و خوب بالطبع تعداد زیادی هم Function و Procedure داره ، بعضی وقت ها خوب بالاخره Error پیش میاد و در برخی از این موارد یه کم سخته که بیایم ببینیم دقیقا کجای برنامه بوده که Error داشته، فرض کنیم یک دکمه موقع زده شدن میاد یه Function رو Call میکنه و اگه به Error خورد، اگر کد دکمه Try و Catch داشته باشه که اونجا نشون میده، اگر نداشته باشه و Function فراخونده شده Try و Catch داشته باشه، تابع نشون میده که Error چیه و از این قبیل مسائی که باعث می شه سخت پیدا کنیم کجای کار ایراد داره، مخصوصا وقتی نرم افزار شما دست User هست و اون هم هیچ چی غیر از اینکه " این برنامه Error میده! " به شما نمی گه.

من به نظرم رسید که برای هر کدوم از فرم ها و کلاس ها یک کد دو رقمی هگزا دسیمال در نظر بگیریم و برای هر کدوم از Sub ها و Function ها هم همینطور و توی همه اینها Try و Catch بذاریم. مثلا اگر کد هگز فرم Main باشه E2 و کد تابع Test در فرم Main باشه 9D، اونوقت کدش مثلا اینجوری می شه :



Function Test() as Object
' Function Code : 9D , Form Code E2
Try
.........
.........
.........
.........
Catch Ex As Exception
Msgbox(Ex.Message,MsgBoxStyle.Critical,"Error : 0xE29D")
End Try


اونوقت با این کد E29D می تونیم به راحتی محل وقوع خطا رو تشخیص بدیم.

حالا اگر کس دیگه نظر بهتری داره یا اینکه قیلا این کار رو کرده نظر بده، ممنون می شم.

در پایان هم می گم طبق یک اصل " نرم افزار بدون Bug وجود نداره "

reza6384
سه شنبه 24 اردیبهشت 1387, 23:16 عصر
هیچ کس نظری نداره ؟؟؟

fat_roze2000
جمعه 03 خرداد 1387, 12:03 عصر
میتونی از stacktrace شئ ex استفاده کنی

علیرضا مداح
جمعه 03 خرداد 1387, 12:29 عصر
سلام دوست عزیز ،
شما نیاز به پیاده سازی Automatic Exception Handling در VB.Net دارید ، بدینمنظور بر روی My Project دابل کلیک کرده و در تب Application دکمه View Application Events را بزنید ، اکنون یک فایل با نام ApplicationEvents.vb به پروژه شما اضافه میشود ، آن را باز کرده و به صورت زیر تغییر دهید :


Namespace My
' The following events are availble for MyApplication:
'
' Startup: Raised when the application starts, before the startup form is created.
' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally.
' UnhandledException: Raised if the application encounters an unhandled exception.
' StartupNextInstance: Raised when launching a single-instance application and the application is already active.
' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.
Partial Friend Class MyApplication
Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.Unhandle dExceptionEventArgs) Handles Me.UnhandledException
MessageBox.Show(e.Exception.ToString())
End Sub
End Class
End Namespace

reza6384
دوشنبه 06 خرداد 1387, 17:23 عصر
با سلام و تشکر از شما جناب مداح.

من این کاری که شما گفتین رو انجام دادم و یه جای برنامه Error گذاشتم ، وقتی به اون میرسه این صفحه زیر رو نشون می ده که به نظر من برای کاربر یه کم وحشتناکه و خیلی شلوغه و نمیشه راحت فهمید که کجای این برنامه به مشکل برخورده ( البته برای کاربر )

reza6384
دوشنبه 06 خرداد 1387, 17:25 عصر
سلام. خیلی ممنون ، من این کار رو کردم ، اما موقع Error خوردن در برنامه Message بزرگی نمایش داده می شه که برای کاربر وحشتناکه و کاربر نمی تونه بگه کجای برنامه به Error بر خورده و جستجوش سخت می شه ، اما با یه مسیج باکس کوچیک و اون کد هگزا دسیمال فکر می کنم یه کاری بشه کرد. باز هم اگر نظرتون رو بگین ممنون می شم.

علیرضا مداح
دوشنبه 06 خرداد 1387, 19:30 عصر
سلام. خیلی ممنون ، من این کار رو کردم ، اما موقع Error خوردن در برنامه Message بزرگی نمایش داده می شه که برای کاربر وحشتناکه و کاربر نمی تونه بگه کجای برنامه به Error بر خورده و جستجوش سخت می شه ، اما با یه مسیج باکس کوچیک و اون کد هگزا دسیمال فکر می کنم یه کاری بشه کرد. باز هم اگر نظرتون رو بگین ممنون می شم.

دوست عزیز شما میتوانید MessageBox دلخواه خود را طراحی نمایید یا اینکه خطاهای ایجاد شده را در یک فایل به طور مثال به نام Error.txt همراه با زمان وقوع آن را در کنار برنامه ذخیره نمایید،
در ضمن متد e.Exception.ToString() در این مثال گویای همه چیز میباشد و تمامی اطلاعات از قبیل فایل و شماره خط که خطا در آن رخ داده و Stack Trace و نیز متن خطا را شامل میشود ،
برای دریافت اطلاعات بیشتر در مورد کلاس System.Exception به MSDN مراجعه نمایید :
http://msdn.microsoft.com/en-us/library/system.exception.aspx

Dariuosh
سه شنبه 07 خرداد 1387, 00:39 صبح
به نظرم دو سري Error تو برنامه رخ ميده يه دسته اونايي که به خاطر اشکال در استفاده از برنامس (يعني مشکل کاربره) که با يه پيغام خطا که تو دله برنامه پيش بيني شده به کاربر خبر داده ميشه و يه دسته اونايي هستن که اشکال در خوده برنامس و اصلا به کاربر مربوط نميشه و ترجيحاً نبايد با خبر شه چون اکثراً سر در نمياره و بدتر گيج ميشه . ولي در نهايت برنامه نويس به اونا احتياج داره تا بتونه با رفع اونا برنامشو بهبود بده
حالا راه مختلفي هست برا اين که دسترسي داشته باشي به اونا و ترجيحا هرچه سريعتر بهتر
برا اين کار ميشه مرحله بندي کرد
يعني مثلا اول اتصال به اينترنتو چک کرد و در صروت برقراري ارتباط ، Error رو Mail کرد
يا اگه برقرار نبود و برنامه يه برنامه چند کاربره با ديتابيس مرکزي مشترک بود تو ديتابيس ثبتش کرد ، شايد اصلا Error به خاطره قطع ارتباط با ديتابيس درست شده باشه و دسترسي به اون هم نداشته باشيم اون موقع ميشه از Event Viewr مرکزي استفاده کرد يعني همه يه جا نگهداري شن در هر صورت بايد پله پله شرايط رو چک کنيم و يه جوري نگهداريشون کنيم