我已经嵌套了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 around Response.Redirect
,传输生成的ThreadAbortException被外部catch块捕获。
我该如何解决这个问题?谢谢!
答案 0 :(得分:2)
你最简单的做法就是不在你的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
}
答案 1 :(得分:1)
考虑更改第一个响应中的代码
if ( url != "" ) { Response.Redirect(url);}
到
if (!string.IsNullOrEmpty(url)) { Response.Redirect(url);}
答案 2 :(得分:0)
使用变量来跟踪内部try ... catch中何时抛出错误,然后在第二步中使用if语句包围Response.Redirect来检查它。
答案 3 :(得分:0)
每当你在try-catch块中使用Response.Redirect时,你应该添加第二个参数。
而不是:
Response.Redirect("somepage.aspx");
这样做:
Response.Redirect("somepage.aspx", false);
当布尔值为true时,页面内容将被发送到新页面(因此您可以使用表单值)。 当该布尔值为false时,不发送页面内容。这可能就是你想要的。你会知道你是否需要真实。
另一种方法是在空的Catch块中捕获ThreadAbortException。