我已经嵌套了try catch块

try
{
    // statements
    try
    {
        // statements
    }
    catch(SqlException sqlex)
    {
        Response.Redirect(@"~/Error.aspx?err=" + Server.UrlEncode(sqlex.Message)
                              + "&src=" + Server.UrlEncode(sqlex.ToString()));
    }
    catch (Exception ex)
    {
        Response.Redirect(@"~/Error.aspx?err=" + Server.UrlEncode(ex.Message)
                              + "&src=" + Server.UrlEncode(ex.ToString()));
    }
    finally
    {
        conn.Close();
    }
}
catch (Exception ex)
{
    Response.Redirect(@"~/Error.aspx?err=" + Server.UrlEncode(ex.Message)
                          + "&src=" + Server.UrlEncode(ex.StackTrace)); 
}
finally
{
    conn.Close();
}

如果在内部第一个catch块捕获了SqlExeception,那么也因为try ... catch arounds Response.Redirect,传输生成的ThreadAbortException被外部catch块捕获。

我该如何解决这个问题?谢谢!

有帮助吗?

解决方案

阅读这篇文章

你最简单的做法就是不在你的try / catch线束中重定向:

string url ;
try 
     { 
            // statements 
            try 
            { 
            } 
            catch(SqlException sqlex) 
            { 
               url = @"~/Error.aspx?err=" + Server.UrlEncode(sqlex.Message) + "&src=" + Server.UrlEncode(sqlex.ToString()); 
            } 
            catch (Exception ex) 
            { 
                url = @"~/Error.aspx?err=" + Server.UrlEncode(ex.Message) + "&src=" + Server.UrlEncode(ex.ToString()); 
            } 
            finally 
            { 
                conn.Close(); 
            } 
    } 
    catch (Exception ex) 
        { 
            url = @"~/Error.aspx?err=" + Server.UrlEncode(ex.Message) + "&src=" + Server.UrlEncode(ex.StackTrace);  
        } 
        finally 
        { 
            conn.Close(); 
        } 
} 

if ( url != "" ) {
    Response.Redirect(url);
}
else {
    // Page logic can continue
}

其他提示

考虑更改第一个响应中的代码

if ( url != "" ) { Response.Redirect(url);}

if (!string.IsNullOrEmpty(url)) { Response.Redirect(url);}

使用变量来跟踪内部try ... catch中何时抛出错误,然后在第二步中使用if语句包围Response.Redirect来检查它。

每当你在try-catch块中使用Response.Redirect时,你应该添加第二个参数。

而不是:

Response.Redirect("somepage.aspx");

这样做:

Response.Redirect("somepage.aspx", false);

当布尔值为true时,页面内容将被发送到新页面(因此您可以使用表单值)。 当该布尔值为false时,不发送页面内容。这可能就是你想要的。你会知道你是否需要真实。

另一种方法是在空的Catch块中捕获ThreadAbortException。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top