Response.Redirect および Server.Transfer メソッドでページ遷移を行うと内部的に Response.End を呼び出します。これが原因で ThreadAbortException 例外が発生し、try ~ catch 処理を行っている場合には例外を捕捉してしまいます。try ~ catch で例外を捕捉していない場合は問題なく処理は継続されます。愚直さが裏目に出てしまうこともあるということです。
スポンサーリンク
ThreadAbortException 例外を捕捉してしまうこサンプル
VB.NET
Protected Sub Button1_Click(ByVal sender As Object, _ ByVal e As EventArgs) Handles Button1.Click Try Response.Redirect("redirect.aspx") Catch ex As Exception ' ThreadAbortException 例外を捕捉してしまう End Try End Sub Protected Sub Button2_Click(ByVal sender As Object, _ ByVal e As EventArgs) Handles Button2.Click Try Server.Transfer("transfer.aspx") Catch ex As Exception ' ThreadAbortException 例外を捕捉してしまう End Try End Sub
C#
protected void Button1_Click(object sender, EventArgs e) { try { Response.Redirect("redirect.aspx"); } catch (Exception ex) { // ThreadAbortException 例外を捕捉してしまう } } protected void Button2_Click(object sender, EventArgs e) { try { Server.Transfer("transfer.aspx"); } catch (Exception ex) { // ThreadAbortException 例外を捕捉してしまう } }
ThreadAbortException 例外の発生をなくすには
Response.Redirect および Server.Transfer メソッドの第2パラメータに false を与えることで例外の発生をなくすことができます。内部的に Response.End が呼び出されなくなります。
VB.NET
' ThreadAbortException 例外は発生しない Response.Redirect("redirect.aspx", False) Server.Transfer("transfer.aspx", False)
C#
// ThreadAbortException 例外は発生しない Response.Redirect("redirect.aspx", false); Server.Transfer("transfer.aspx", false);
その対応としては、やはりこれまた愚直に ThreadAbortException 例外のみを無視する方法が良いかと思いますが、try ~ catch 内の他の処理との兼ね合いや処理量など個々の状況に応じて対応方法を判断すれば良いと思います。
C#
try { Server.Transfer("transfer.aspx"); } catch (System.Threading.ThreadAbortException aex) { // 無視する } catch (Exception ex) { // 例外処理を行う }
参考