10

比如说,我有一个 try/catch 块,它封装了一大块代码,然后我需要在其中的某个地方调用 Response.Redirect :

protected void ButtonGo_Click(object sender, EventArgs e)
{
    try
    {
        using(lockingMethod)
        {
            //Code...

            //Somewhere nested in the logic
            Response.Redirect(strMyNewURL);

            //More code...
        }
    }
    catch(Exception ex)
    {
        LogExceptionAsError(ex);
    }
}

在这种情况下发生的事情是Response.Redirect抛出一个异常,关于终止线程的事情,我认为这是该方法的“正常事件流”,但它被记录LogExceptionAsError为错误。所以我很好奇,有什么办法可以Response.Redirect不抛出异常?

4

2 回答 2

7

尝试使用替代版本Response.Redirect

Response.Redirect(strMyNewURL, false);

它将终止当前页面加载。

于 2013-07-02T04:27:37.353 回答
6

Response.Redirect通过抛出此异常来完成当前执行的终止,从而立即重定向,使其未被处理。这是有意和设计的。在大多数情况下,您不应该自己抓住它 - 它违背了目的。如果您希望在重定向之前完成代码的执行,可以使用重载:

Response.Redirect(somewhere, false);

这不会引发异常。除非您在重定向之前需要做其他事情,否则这可能效率低下。

请注意,这通常是一种反模式 - 通过异常抛出和捕获来控制逻辑流......但是,这种特殊方法这样做是有意义的,因为重定向通常不需要进一步的逻辑来执行 - 只需响应 302 和要去的新地址。

于 2013-07-02T05:17:12.433 回答