9

我遇到了一些奇怪response.redirect()的错误,并且项目根本没有构建..当我删除了围绕代码块的try-catchResponse.Redirect()块时,它正常工作..

只是想知道这是一个已知问题还是什么......

4

5 回答 5

23

如果我没记错的话,Response.Redirect()抛出异常以中止当前请求(ThreadAbortedException或类似的东西)。因此,您可能会遇到该异常。

编辑:

知识库文章描述了此行为(也适用于Request.End()Server.Transfer()方法)。

因为Response.Redirect()存在过载:

Response.Redirect(String url, bool endResponse)

如果您通过endResponse=false,则不会引发异常(但运行时将继续处理当前请求)。

如果endResponse=true(或者如果使用了其他重载),则抛出异常并且当前请求将立即终止。

于 2009-06-30T13:19:34.580 回答
4

正如 Martin 指出的那样,Response.Redirect 会引发 ThreadAbortException。解决方法是重新抛出异常:

try  
{
   Response.Redirect(...);
}
catch(ThreadAbortException)
{
   throw; // EDIT: apparently this is not required :-)
}
catch(Exception e)
{
  // Catch other exceptions
}
于 2009-06-30T13:21:29.617 回答
3

Martin 是正确的,当您使用 Response.Redirect 时会抛出 ThreadAbortException,请参阅此处的 kb 文章

于 2009-06-30T13:22:04.687 回答
0

您可能引用了在 try 块中声明的变量。

例如,以下代码无效:

try
{
  var b = bool.Parse("Yeah!");
}
catch (Exception ex)
{
  if (b)
  {
    Response.Redirect("somewhere else");
  }
}

您应该将 b 声明移到 try-catch 块之外。

var b = false;
try
{
  b = bool.Parse("Yeah!");
}
catch (Exception ex)
{
  if (b)
  {
    Response.Redirect("somewhere else");
  }
}
于 2009-06-30T13:26:30.417 回答
-3

我认为这里没有任何已知问题。

您根本无法在 try/catch 块内执行 Redirect(),因为 Redirect 将当前控件留给另一个 .aspx(例如),这会使捕获悬而未决(无法返回)。

编辑:另一方面,我可能已经把所有这些都倒过来了。对不起。

于 2009-06-30T13:22:07.947 回答