响应.重定向try/catch块内的异常

本文关键字:异常 catch 重定向 try 响应 | 更新日期: 2023-09-27 18:20:49

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

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不抛出异常?

响应.重定向try/catch块内的异常

尝试使用Response.Redirect 的替代版本

Response.Redirect(strMyNewURL, false);

它将终止当前页面加载。

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

Response.Redirect(somewhere, false);

这不会引发异常。这可能是低效的,除非你需要在重定向之前做其他事情。

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