程序中使用try catch
對於預知會發生異常的代碼段使用try catch主動捕獲異常適用於提示給用戶或跳轉到錯誤頁面或者通過其它方式處理異常(日志通知等)
int i = ;
int j = ;
try
{
LabelText = (i / j)ToString()
}
catch (Exception ex)
{
// 這裡處理異常RedirectTransferLogNotice等
ConsoleWriteLine(Page: + exMessage)
}
Global中使用Application_Error
如果異常在程序中沒有被處理(如沒有try catch)則異常的處理會流轉到這個方法這裡邊可以對異常進行處理但是此方式不能捕捉子線程中的異常
int i = ;
int j = ;
LabelText = (i / j)ToString()
void Application_Error(object sender EventArgs e)
{
// 在出現未處理的錯誤時運行的代碼
ServerTransfer(ErrorPageaspx)
}
string message = HttpContextCurrentError != null ? (HttpContextCurrentErrorInnerException != null ? HttpContextCurrentErrorInnerExceptionMessage : stringEmpty) : stringEmpty;
LabelText = message;
在nfig中配置
出現錯誤後跳轉到ErrorPageaspx和Application_Error類似采用redirectMode模式可以傳遞異常到錯誤頁面
使用FirstChance異常通知
關聯到AppDomain如果應用程序域內發生異常則會首先觸發這個事件然後才查找catch塊處理異常不過在這個事件中不能處理異常不能消滅異常只是可以按照通知進行處理因為如果這裡處理了異常catch塊就不能進行處理了
void Application_Start(object sender EventArgs e)
{
// 在應用程序啟動時運行的代碼
AppDomainCurrentDomainFirstChanceException += new EventHandler<SystemRuntimeExceptionServicesFirstChanceExceptionEventArgs>(CurrentDomain_FirstChanceException)
}
void CurrentDomain_FirstChanceException(object sender SystemRuntimeExceptionServicesFirstChanceExceptionEventArgs e)
{
ConsoleWriteLine(eExceptionMessage)
// 錯誤響應在上下文中不能使用
// ResponseRedirect(ErrorPageaspx)
// 錯誤未將對象引用設置到對象的實例
// ServerTransfer(ErrorPageaspx)
}
綁定UnhandledException事件
關聯到AppDomain關於這個事件並不是每次都能觸發和使用的方式有關情況比較多一般情況下我們只能獲取這個異常而不能阻止中斷應用程序
下邊給出一個例子
void Application_Start(object sender EventArgs e)
{
// 在應用程序啟動時運行的代碼
AppDomainCurrentDomainUnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException)
}
void CurrentDomain_UnhandledException(object sender UnhandledExceptionEventArgs e)
{
ConsoleWriteLine(eExceptionMessage)
}
一般的未處理異常都會被Application_Error捕捉到我們這裡在線程中拋出一個異常
另外StackOverflowException在net中不再能被UnhandledException捕捉到
private void CutString()
{
//throw (new Exception(Test Unhandled exception))
//throw (new StackOverflowException(Test Unhandled exception))
}
protected void Button_Click(object sender EventArgs e)
{
Thread th = new Thread(new ThreadStart(CutString))
thStart()
}
延伸子線程異常的處理網上有介紹通過代理在主線程處理子線程的異常但是在中是無狀態的主線程有可能很快消失其中的某些處理可能執行失敗
這裡使用ThreadSleep使主線程不會很快結束這種異常處理起來很麻煩不建議在中使用處理時間很長的線程
protected void Button_Click(object sender EventArgs e)
{
Thread th = new Thread(new ThreadStart(() =>
{
try
{
throw (new Exception(Test Unhandled exception))
}
catch (Exception ex)
{
//跳轉到錯誤頁面
ResponseRedirect(ErrorPageaspx)
}
}))
thStart()
// 主線程會很快結束這裡讓他等等頁面跳轉
ThreadSleep()
}
本文列舉了處理異常的幾種方式有通過訂閱AppDomain事件的方式有通過配置文件的方式還有通過Global的方式最後還對子線程異常的處理談了一點想法但是都沒有提供一個完善的解決方案有興趣的朋友可以自己試試
From:http://tw.wingwit.com/Article/program/net/201311/12051.html