Response.Redirect - 使用流量控制的异常?

时间:2009-02-23 10:18:30

标签: asp.net exception redirect response.redirect

Response.Redirect有两个重载:

public void Redirect(string url)

Parameters:
url: The target location.
public void Redirect(string url, bool endResponse)
Parameters:
url: The location of the target.
endResponse: Indicates whether execution of the current page should terminate.

如果我调用第一个重载,或者将endResponse设置为true来调用第二个重载,则ThreadAbortException会被抛出。

为什么我会想要使用这种方法?这不是使用异常来处理程序流的示例吗? (因此是一件坏事)

如果我的重定向确实需要一个例外,那么我是不是更愿意抛出一个包含原因重定向的更具信息性的异常?

4 个答案:

答案 0 :(得分:2)

如果你将endResponse设置为“true”,你实际上是在说“我完成了这个页面,忽略了我之后的任何事情”。

引发“ThreadAbortException”的原因是,在您发送到下一页之前,会触发您编写的任何Lasts / Catches等,并且会正确清理资源。

来自MSDN

  

ThreadAbortException是一个可以捕获的特殊异常,但它会在catch块的末尾自动再次引发。引发此异常时,运行时将在结束线程之前执行所有finally块。

答案 1 :(得分:2)

Zhaph是对的,因为你在try catch块中重定向,所以发生了异常。

而不是

try {
    ...
    Response.Redirect(url);
} catch {
    ...
}

按照以下方式做点什么:

bool bSuccess = true;
try {
    ...
} catch {
    bSuccess = false;
    ...
}

if (bSuccess) {
    Response.Redirect(url);
}

答案 2 :(得分:1)

我认为其背后的理论是避免浪费马力。如果您在请求周期中确定了5个函数调用深度,那么重定向是合适的,那么您需要某种方式向所有更高级别的函数发出信号“我们已经完成了,不要再浪费在这个请求上” ,asp.net本身也需要这样做。

我认为asp.net团队采用这种方法而不是a)使用函数的返回值(这意味着如果函数具有逻辑返回值,则必须通过Ref / Out参数处理),或者b)在请求上设置标志。当然,ASP.Net本身就是为了纪念这个标志而写的,但有多少初学者开发人员应该检查它(在每次调用函数之后?),所以他们可能仍会做一些重量级的工作。浪费了。

答案 3 :(得分:1)

有时,异常是控制程序流程的最佳方式。

当然,通常并非如此。因此,如果您发现自己使用控制流的异常,请仔细检查没有更好的替代方案。

Response.Redirect上中止当前线程的例外通常是件好事,因为这正是你想要发生的事情。