简体   繁体   中英

Is there something that prevents Response.Redirect to work inside try-catch block?

I got some weird error with response.redirect() and the project wasn't building at all.. when I removed the try-catch block that was surrounding the block of code where Response.Redirect() was in it worked normally..

Just want to know if this is a known issue or something...

If I remember correctly, Response.Redirect() throws an exception to abort the current request ( ThreadAbortedException or something like that). So you might be catching that exception.

Edit:

This KB article describes this behavior (also for the Request.End() and Server.Transfer() methods).

For Response.Redirect() there exists an overload:

Response.Redirect(String url, bool endResponse)

If you pass endResponse=false , then the exception is not thrown (but the runtime will continue processing the current request).

If endResponse=true (or if the other overload is used), the exception is thrown and the current request will immediately be terminated.

As Martin points out, Response.Redirect throws a ThreadAbortException. The solution is to re-throw the exception:

try  
{
   Response.Redirect(...);
}
catch(ThreadAbortException)
{
   throw; // EDIT: apparently this is not required :-)
}
catch(Exception e)
{
  // Catch other exceptions
}

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

You may have referenced a variable that is declared inside the try block.

For example, the below code is invalid:

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

You should move out the b declaration to outside the try-catch block.

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

I don't think there is any known issue here.

You simply can't do a Redirect() inside a try/catch block because Redirect leaves the current control to another .aspx (for instance), which leaves the catch in the air (can't come back to it).

EDIT: On the other hand, I might have had all of this figured backwards. Sorry.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM