2009-09-01 71 views
5

我正在學習ASP.NET並正在查看QueryStrings。當我運行Response.Redirect()時,爲什麼會出現拋出的異常?

一個我一直在尋找的例子掛鉤按鈕高達轉接呼叫:

protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      //throws ThreadAbortException: "Thread was being aborted" 
      Response.Redirect("Form2.aspx"); 
     } 
     catch (Exception Ex) 
     { 
      System.Diagnostics.Debug.WriteLine(Ex.Message); 
     } 
    } 

爲什麼在這裏拋出一個ThreadAbortException?這是正常的嗎?我應該對此做些什麼?例外情況通常不是一件好事,所以當我看到這件事時我很驚慌。

+0

http://stackoverflow.com/questions/1063625/is-there -something - 即,防止響應重定向到工作中,的try-catch塊 – 2009-09-02 00:29:19

回答

12

這是設計。這KB article描述了行爲(也爲Request.End()Server.Transfer()方法)。

對於Response.Redirect()存在過載:

Response.Redirect(String url, bool endResponse) 

如果傳遞endResponse =假,則沒有拋出異常(但運行時將繼續處理當前請求)。

如果endResponse = true(或者如果您使用沒有bool參數的重載),則拋出異常並立即終止當前請求。

+2

我懷疑這實際上是「被設計」,也許是他們設計的一個不幸後果? ;) – MedicineMan 2009-09-01 21:52:28

+2

「通過設計」並不意味着選定的設計是完美的;-) – M4N 2009-09-02 07:55:02

3

這是正常現象。 Server.Transfer()也會引發相同的異常。

這是因爲在內部,兩種方法都會調用Response.End(),這會立即中止當前的請求處理。裏克斯特拉爾有一個pretty good blog post分析爲什麼幾乎沒有什麼可以做,以避免這些例外。

1

我相信你需要關注這篇知識庫文章中的說明。 Response.Redirect會調用Response.End(),除非您使用了特定的重載來避免此行爲。一旦響應結束,不會有進一步的操作發生,因此TA exc。

http://support.microsoft.com/kb/312629

2

這是正常的,它是什麼的意思發生。基本上,當響應被設置爲重定向時,ASP.NET希望完全完成請求。它會中止該線程作爲防止發生其他處理的一種方式(基本上它會爲您調用Response.End,並引發異常)。

在我看來,這是有點濫用例外,但這是它的工作方式。您可以使用具有第二個參數的過載(並通過false)來防止發生這種情況 - 但如果是這樣,請確保沒有其他東西嘗試寫入響應!

0

呼叫重定向(),它只是需要一個URL也導致到Response.End以()的調用的過載 - 它拋出一個異常ThreadAbort,以確保在你的頁面重定向之後沒有其他代碼/ UC運行。

你不應該抓住這個例外..你應該在你的代碼中忽略它,或者使用Redirect()的重載,它使用一個布爾值來指示在重定向之後是否繼續處理請求。

2

的Response.Redirect到Response.End調用內部,所以它拋出異常,則應使用:

Response.Redirect(url, false); 
0

呀。我編寫了一個退出子,但我知道它沒有達到。

我想,如果你想你可以吃的異常,並進行更多的東西后記,但我不會推薦它。

0

已經是一堆這裏合理的答案。另一點值得注意。線程中止異常是您可以捕獲和編碼的罕見異常之一,但您無法壓制。無論你做什麼,它都會在任何try/catch/finally塊結束時自動重新提升。

如果你決定住這個例外,你應該確保你的健康監測允許這一點,它不報告作爲一個問題,這樣你就不會陷入一堆非技術性的前經理試圖解釋爲什麼你的網站拋出了這麼多的線程異常終止。 (我有一個經理相信,所有這些線程墮胎是留下一個爛攤子這當然是完全相反的線程中止的意圖。)

相關問題