PDA

View Full Version : چطور بفهمم اگه توي پروژه يا فرم يك خطايي اتفاق بيفته اونو لاگ كنم؟



swallow.pa
پنج شنبه 09 بهمن 1393, 19:40 عصر
دوستان سلام
يكي از راههايي كه مي مي تونيم پروژه ها رو خوب پشتيباني كنيم اينه كه خطاهايي كه در پروژه اتفاق مي افتد رو توي يك فايل تكست لاگ كنيم
من مي دونم با استفاده از دستور try catch end try
مي تونم خطايي رو كه اتفاق مي افته رو مديريت كنم و اونو لاگ كنم

اما مشكل من اينجاست كه : توي يك فرم مثلا 100 تا ساب روتين هست من كه نمي تونم توي همه اونها از 100 تا try catch end try استفاده كنم
چطور مي تونم و با چه شيوه اي امكان پذيره كه خطا رو مديريت كنم ممنون

Saman_12
پنج شنبه 09 بهمن 1393, 20:13 عصر
باید از Event ه AppDomain.CurrentDomain.UnhandledException استفاده کنید.
یا از Event ه Application.ThreadException استفاده کنید.
یا اینکه تو Properties پروژه تو سربرگ Application روی Application Events کلیک کنید بعد تو Solution Explorer روی فایل Application Event کلیک کنید و از Event ه UnhandledException استفاده کنید.(فکر کنم این فقط برای VB باشه)
تو Debug هم جواب نمیده. باید برنامه مستقل از Debuger اجرا شه تا اون Event کار کنه.

swallow.pa
پنج شنبه 09 بهمن 1393, 20:20 عصر
باید از Event ه AppDomain.CurrentDomain.UnhandledException استفاده کنید.
یا اینکه تو Properties پروژه تو سربرگ Application روی Application Events کلیک کنید بعد تو Solution Explorer روی فایل Application Event کلیک کنید و از Event ه UnhandledException استفاده کنید.(فکر کنم این فقط برای VB باشه)
تو Debug هم جواب نمیده. باید برنامه مستقل از Debuger اجرا شه تا اون Event کار کنه.

دوست من از توجهتون ممنون ولي من مبتدي اصلا متوجه نشدم اين مبحث برام جديده ميشه بيشتر توضيح بديد
ممنونم

Saman_12
پنج شنبه 09 بهمن 1393, 20:33 عصر
کجاش رو مشکل دارید؟
همون مسیری که گفتم رو دنبال کنید بعد محتوی فایل اظافه شده به پروژه (ApplicationEvents.vb) به این شکل تغییر بدید و استفاده کنید :

Namespace My


' The following events are available 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(sender As Object, e As ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException


'e.Exception = یه کلاس نمونه از خطایی که رخ داده
'e.ExitApplication = در صورت نیاز به خروج از برنامه یا عدم اون استفاده میشه
End Sub
End Class
End Namespace


اینم یه لینک به MSDN :
https://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception(v=vs.110).aspx ?cs-save-lang=1&cs-lang=vb#code-snippet-2
و یکی دیگه :
https://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception(v =vs.110).aspx

swallow.pa
پنج شنبه 09 بهمن 1393, 21:01 عصر
دوست گرامي از توجه شما ممنونم من اين كدها رو اضافه كردم



Namespace My


' The following events are available 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(sender As Object, e As ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException


MsgBox(e.Exception.ToString & " " & Now.Date)


'e.Exception = یه کلاس نمونه از خطایی که رخ داده
'e.ExitApplication = در صورت نیاز به خروج از برنامه یا عدم اون استفاده میشه
End Sub
End Class




End Namespace




توي فرم يك هم اين كدها رو نوشتم


Public Class Form1


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim i As Integer






i = 3556000000000




End Sub
End Class




خب بايد اينجا خطاي over folow اتفاق بيفته با كليك بر روي باتن عملا اتفاقي نمي افته؟
در حقيقت دارم توليد خطا مي كنم كه عملكرد برنامه رو ببينم اما اتفاقي نمي افته
مشكل از كجاست؟
ممنونم

Saman_12
پنج شنبه 09 بهمن 1393, 21:16 عصر
نمیدونم چطوری اون رو Build کردین آخه خود VS ازش خطا میگیره!
به هر حال اگر مستقل از دیباگر اجرا کنید جواب میده. این رو امتحان کنید :
Throw New Exception("It is a test Exception")

swallow.pa
پنج شنبه 09 بهمن 1393, 21:32 عصر
اين كار رو كردم اما مسنقيم روي همين خط خطا گرفت
تصوير پيوست

swallow.pa
پنج شنبه 09 بهمن 1393, 21:40 عصر
خب يه كار ديگه كردم يه جدول تو ديتابيس دارم بنام person كه دوتا فيلد داره name family حالا من بعمد كد زير رو براي اضافه كردن نوشتم كه اشتباست:


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
With BindingSource1
.AddNew()
.Current.Item("5") = 25
.EndEdit()


End With


End Sub


اون فيلده اصلا وجود نداره ولي خطا رو اينجور نشون مي دهد
تصوير پيوست:

Saman_12
پنج شنبه 09 بهمن 1393, 21:54 عصر
مطمئنید شما مسیر
Project->ProjName Property...->Appilication->View Application Events رو دنبال کردید و فایل ApplicationEvents به پروژه اظافه شده و داخل اون همون کد ها رو نوشتید؟
بعد از اون هم خدمتتون عرض کردم که بدون دیباگر اجراش کنید

چرا با دیباگر اجرا میکنید؟
باید بدون دیباگر اجرا کنید و دستورات مد نظر هم نباید داخل try باشند (کلا ساختار های ارور هندلینگ)

Saman_12
پنج شنبه 09 بهمن 1393, 22:34 عصر
این نمونه ای که از ThreadException استفاده کردم :

Private Sub CreateErrorHandler()


AddHandler Application.ThreadException, AddressOf ErrorHandler
End Sub


Private Sub ErrorHandler(sender As Object, e As Threading.ThreadExceptionEventArgs)


IO.File.AppendAllText("log.txt", vbNewLine & "Error at :" & Date.Now.ToString & vbNewLine _
& e.Exception.ToString)
Dim message As String = "Dear user we got some error and logged it, please call suport-team." _
& vbNewLine & "Do you want exit program?"
Dim dlg_result As DialogResult = MessageBox.Show(message, "Error", MessageBoxButtons.YesNo, _
MessageBoxIcon.Error,MessageBoxDefaultButton.Butto n1)
If dlg_result = Windows.Forms.DialogResult.Yes Then Application.Exit()
End Sub

swallow.pa
جمعه 10 بهمن 1393, 10:19 صبح
مطمئنید شما مسیر
Project->ProjName Property...->Appilication->View Application Events رو دنبال کردید و فایل ApplicationEvents به پروژه اظافه شده و داخل اون همون کد ها رو نوشتید؟
بعد از اون هم خدمتتون عرض کردم که بدون دیباگر اجراش کنید

چرا با دیباگر اجرا میکنید؟
باید بدون دیباگر اجرا کنید و دستورات مد نظر هم نباید داخل try باشند (کلا ساختار های ارور هندلینگ)

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



Namespace My


' The following events are available 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(sender As Object, e As ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException


MsgBox(e.Exception.ToString & " " & Now.Date)


'e.Exception = یه کلاس نمونه از خطایی که رخ داده
'e.ExitApplication = در صورت نیاز به خروج از برنامه یا عدم اون استفاده میشه
End Sub
End Class




End Namespace



اما در مورد اينكه بدون ديباگر برنامه رو اجرا كنم اعتراف مي كنم كه بلد نيستم و مي خوام بپرسم چطور نرم افزار رو بدون ديباگر اجرا كنم؟

swallow.pa
جمعه 10 بهمن 1393, 10:32 صبح
این نمونه ای که از ThreadException استفاده کردم :

Private Sub CreateErrorHandler()


AddHandler Application.ThreadException, AddressOf ErrorHandler
End Sub


Private Sub ErrorHandler(sender As Object, e As Threading.ThreadExceptionEventArgs)


IO.File.AppendAllText("log.txt", vbNewLine & "Error at :" & Date.Now.ToString & vbNewLine _
& e.Exception.ToString)
Dim message As String = "Dear user we got some error and logged it, please call suport-team." _
& vbNewLine & "Do you want exit program?"
Dim dlg_result As DialogResult = MessageBox.Show(message, "Error", MessageBoxButtons.YesNo, _
MessageBoxIcon.Error,MessageBoxDefaultButton.Butto n1)
If dlg_result = Windows.Forms.DialogResult.Yes Then Application.Exit()
End Sub


دوست گرامي اين كدها رو توي همون مسيري كه گقتي بكار ببرم كاش يك نمونه اپلود مي كردي من هنوز با اين قسمت مشكل دارم :ناراحت:

Saman_12
جمعه 10 بهمن 1393, 13:04 عصر
برای اجرای مستقل از دیباگر برنامه رو از پوشه پروژه اجرا کنید یا از منوی Debug گزینه ی Start Without Debugger رو انتخاب کنید(Ctrl+F5).

swallow.pa
جمعه 10 بهمن 1393, 18:48 عصر
دوست گرامي ممنون يه سوال در اين قسمت

roject->ProjName Property...->Appilication->View Application Events ر
كارهايي ديگه هم انجام ميشه در صورت امكان توضيح بديد
ممونم

Saman_12
جمعه 10 بهمن 1393, 20:20 عصر
جناب آقای محسن شامحمدی قبلا زحمتش رو کشیدند :
http://barnamenevis.org/showthread.php?280611-آشنایی-با-کلاس-Application-Events&highlight=UnhandledException