Abort一定會拋出ThreadAbortException異常
ThreadAbortException 類
在對 Abort 方法進行調用時引發的異常。無法繼承此類。
備忘
在調用 Abort 方法以銷毀線程時,公用語言運行庫將引發 ThreadAbortException。ThreadAbortException 是一種可捕獲的特殊異常,但在 catch 塊的結尾處它將自動被再次引發。引發此異常時,運行庫將在取消線程前執行所有 finally 塊。由於線程可以在 finally 塊中進行未綁定的計算,因此必須調用 Join 方法以保證線程已死亡。Join 是一個阻塞調用,它要到線程實際停止執行後才返回。
ThreadAbortException 使用值為 0x80131530 的 HRESULT COR_E_THREADABORTED。
將Response.Redirect寫入try...catch會出現異常
try
{
Response.Redirect("Index.aspx");
}
catch(Exception e)
{
Response.Redirect("Error.aspx?message=" + e.Message);
}
如上,則會顯示"Thread was being aborted. "異常
同樣的還有Response.End()等提前結束當前Theard的方法
解決方案一:
如果 Response.Redirect("Index.aspx"); 必須寫到Try{}裡,則可以在Catch語句寫入:
catch(Exception e)
{
if (!(e is ThreadAbortException))
{
Response.Redirect("Error.aspx?message=" + e.Message);
}
}
略過系統對這個特殊異常的處理。
解決方案二:
MSDN已經解析清楚了
“調用 Redirect 等效於在將第二個參數設定為 true 的情況下調用 Redirect。 Redirect 調用 End,它在完成時引發 ThreadAbortException 異常。” 可見Redirect方法在內部是調用 Thread.Abort()來中止線程的從而引發ThreadAbortException 異常。如果不想立刻中止則,第二個參數設定為false
C# code
-
protected void Button1_Click(object sender, EventArgs e)
{
try
{
Response.Redirect("A.aspx",false);
}
catch( Exception e1)
{
Response.Redirect("B.aspx");
}
}
-
對於 Server.Transfer,請改用 Server.Execute 方法。