我在想,是否可以「覆蓋」或可能替換標準winforms .net異常形式?替換.net中的標準異常/錯誤形式
我談論這個傢伙:
是否有可能,孔程序的範圍時,要重寫此窗口?我的意思是automaticaly,而不必執行try/catch。
謝謝!
丹尼爾
我在想,是否可以「覆蓋」或可能替換標準winforms .net異常形式?替換.net中的標準異常/錯誤形式
我談論這個傢伙:
是否有可能,孔程序的範圍時,要重寫此窗口?我的意思是automaticaly,而不必執行try/catch。
謝謝!
丹尼爾
您可以處理System.Windows.Forms.Application.ThreadException活動,顯示您的自定義消息。
在webforms中,可以在global.asax中處理Application_Error。但似乎你在談論winforms。在這種情況下:
嘗試添加以下代碼到你的主起動機方法:
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ExceptionHandler.OnThreadException);
,並定義的ExceptionHandler類,如下所示:http://www.eggheadcafe.com/community/aspnet/2/27469/any-method-for-handling-error-globally-in-c.aspx
您應該處理:
/// <summary>
/// Main thread error handler.
/// </summary>
public sealed class ExceptionHandler
{
private ExceptionHandler()
{}
/// <summary>
/// Handles an exception on the main thread.
/// </summary>
/// <param name="sender"></param>
/// <param name="t"></param>
public static void OnThreadException(object sender, ThreadExceptionEventArgs t)
{
DialogResult result = DialogResult.Cancel;
try
{
result = ShowThreadExceptionDialog(t.Exception);
}
catch
{
try
{
MessageBox.Show("Fatal Error", "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}
// Exits the program when the user clicks Abort.
if (result == DialogResult.Abort)
Application.Exit();
}
// Creates the error message and displays it.
private static DialogResult ShowThreadExceptionDialog(Exception e)
{
string errorMsg = "An error occurred please contact the adminstrator with the following information:\n\n";
errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace;
return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop);
}
}
取自以下事件:
AppDomain.CurrentDomain.UnhandledException
Application.ThreadException
在這些處理程序中,您可以顯示您製作的自定義表單。
這是ThreadExceptionDialog類,它派生自Form類。從它導出來改變對話框是一個失敗的原因,你不能輕易地進入嵌入式控件。您可以創建自己的Form派生類來創建自己的對話框,只需給它一個帶有Exception參數的構造函數即可。爲Application.ThreadException實現一個事件處理程序來顯示它。
請注意對話框中的根本缺陷。它希望用戶在需要點擊按鈕來解除對話時做出正確的選擇。一般來說,關於究竟發生了什麼問題的信息相當模糊。這對你來說意味着什麼,對用戶來說,很少有什麼比'哦廢話'更重要。點擊繼續按鈕通常不是正確的做法。
爲了避免用戶做出這樣困難的選擇,請在您的Main()方法中調用Application.SetUnhandledExceptionMode(),傳遞ThrowException,以避免引發事件。每個未處理的異常現在都會經過AppDomain.UnhandledException。包括在工作線程中產生的那些線程,例外情況是不會產生對話框。爲它編寫一個事件處理程序,並顯示和/或記錄e.ExceptionObject.ToString()的值。您可以自行決定如何將該信息提供給您的辦公桌或用戶的IT人員,以便您改進產品並使其機器穩定。
檢查this鏈接。
從頁面:
介紹
一個讓我印象深刻,當我第一次開始學習.NET是其增強的異常處理功能的東西。我的意思是這樣的功能,如輕鬆訪問拋出的異常類型,完整的堆棧跟蹤和內部異常。這使得在那些剛抓到頂級System.Exception的地方仍然可以獲得完整的信息。我覺得這很方便,因爲如果你不需要對特定類型的異常採取特定的操作,那麼對於可能拋出的每種類型的異常都有連續的catch處理程序是很繁瑣的。無論如何,即使你確實捕獲了特定的異常,你通常也需要捕獲System.Exception來掩蓋自己並防止程序崩潰。因此,我發現我最終在我的代碼中捕獲了System.Exception。一個典型的情況是,在Windows窗體和ASP.NET Web窗體應用程序中,所有不重要的事件處理程序最終都包含try-catch System.Exception塊。
麻煩的是,這樣做還是有點凌亂的代碼,並沒有真正似乎很正確。有沒有更好的辦法?