2013-07-02 120 views
6

說裏面的Response.Redirect例外,我有一個try/catch塊某處封裝了一大塊代碼,然後在裏面我需要調用的Response.Redirect這樣:的try/catch塊

protected void ButtonGo_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     using(lockingMethod) 
     { 
      //Code... 

      //Somewhere nested in the logic 
      Response.Redirect(strMyNewURL); 

      //More code... 
     } 
    } 
    catch(Exception ex) 
    { 
     LogExceptionAsError(ex); 
    } 
} 

在這種情況下會發生什麼是Response.Redirect引發異常,關於終止線程,我相信這是該方法的「正常事件流」,但它會作爲錯誤記錄在我的LogExceptionAsError中。所以我很好奇,有什麼辦法可以讓Response.Redirect不會拋出異常?

+0

strMyNewUrl的值是什麼? –

+3

可能的重複[有什麼阻止Response.Redirect在try-catch塊內工作嗎?](http://stackoverflow.com/questions/1063625/is-there-something-that-prevents-response-redirect-to -work-inside-try-catch-bloc) –

+0

@AmitSingh:我項目中的其他頁面。我不確定你爲什麼需要它? – c00000fd

回答

4

Response.Redirect

Response.Redirect(strMyNewURL, false); 

替代版本嘗試將終止當前的頁面加載。

+0

事件'catch(ThreadAbortException)'也會捕獲它。我不清楚,但如何處理它? – c00000fd

+0

@ c00000fd:我不確定那個:( – sarwar026

+1

好的,我剛剛介紹了一個調試器,當處理Response.Redirect時,'ThreadAbortException'確實被捕獲了,所以如果處理器留空,CLR將會然後接過 – c00000fd

2

Response.Redirect完成當前執行的終止,並因此通過拋出此異常來立即重定向,使其未被處理。這是有意設計的。在大多數情況下,你不應該自己去捕捉它 - 它會破壞目的。如果您希望完成重定向之前執行的代碼,您可以使用過載:

Response.Redirect(somewhere, false); 

,不會引發異常。這可能是低效的,除非你需要在重定向之前做其他事情。

請注意,這通常是一種反模式 - 通過異常拋出和捕獲來控制邏輯流...然而,對於這種特定的方法來說這樣做是有意義的,因爲重定向通常不需要進一步的邏輯來執行 - 只是響應一個302和新的地址去。

+1

很好的解釋!但是我必須說,我的編程101老師會讓我失敗,如果我會使用這種提取的「技術」。例外是爲了標記壞的東西,而不是一個簡單的方法來「放棄這一切,離開房間「。微軟壞。 – cockypup