【问题标题】:Response.Redirect - using exceptions for flow control?Response.Redirect - 使用异常进行流量控制?
【发布时间】:2009-02-23 10:18:29
【问题描述】:

Response.Redirect 有两个重载:

公共无效重定向(字符串网址)

参数:
url:目标位置。
public void Redirect(string url, bool endResponse)
参数:
url:目标的位置。
endResponse:指示当前页面的执行是否应该终止。

如果我调用第一个重载,或者在 endResponse 设置为 true 的情况下调用第二个重载,ThreadAbortException 会被抛出。

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

如果我的重定向确实需要例外,我最好抛出一个包含重定向的原因的更多信息的异常吗?

【问题讨论】:

    标签: asp.net exception redirect response.redirect


    【解决方案1】:

    如果您将 endResponse 设置为“true”,您实际上是在说“我已完成此页面,忽略我之后的任何内容”。

    引发“ThreadAbortException”的原因是为了触发您编写的所有 Finals/Catches 等,并在将您发送到下一页之前正确清理资源。

    来自MSDN

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

    【讨论】:

      【解决方案2】:

      Zhaph 是对的,发生该异常是因为您在 try catch 块中进行重定向。

      代替

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

      按照以下方式做一些事情:

      bool bSuccess = true;
      try {
          ...
      } catch {
          bSuccess = false;
          ...
      }
      
      if (bSuccess) {
          Response.Redirect(url);
      }
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          Response.Redirect 的异常中止当前线程通常是一件好事,因为这正是您想要发生的事情。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-03-02
            • 1970-01-01
            • 2012-06-29
            • 1970-01-01
            • 1970-01-01
            • 2011-06-03
            • 1970-01-01
            相关资源
            最近更新 更多