[ ASP.NET ] Server.Transfer / Response.Redirect 時の ThreadAbortException 例外

Pocket

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)
    {
        // 例外処理を行う
    }
参考

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *