【发布时间】:2015-11-24 11:45:57
【问题描述】:
在 C# 6 中出现异常过滤器。所以我们可以写一些重试逻辑为
public static void Retry()
{
int i = 3;
do
{
try
{
throw new Exception();
}
catch (Exception) when (--i < 0)
{
throw;
}
catch (Exception)
{
Thread.Sleep(10);
}
} while (true);
}
在控制台应用程序中效果很好。 但是如果我们使用“优化代码”创建网站应用程序,将会出现无限循环,因为“i”的值永远不会改变。如果没有“优化代码”,这将按预期工作。 如何测试: 在空的 asp.net 网站应用程序中创建(我尝试使用 .net 4.5.2 和 .net 4.6)。将此代码添加到全局应用程序类中
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
int i = 3;
do
{
try
{
throw new Exception();
}
catch (Exception) when (--i < 0)
{
throw;
}
catch (Exception)
{
Thread.Sleep(10);
}
} while (true);
}
}
项目属性 -> 构建 -> 勾选“优化代码”。运行应用程序。获取无限循环。 这是正确的行为还是编译器中的错误?
更新1:
所以这似乎是非常罕见的情况,有 unar 递减和重新抛出异常。
在 Windows 7 上的 VS 2015 中编译时重复(在多台机器上尝试)。在 Windows 10 上的 VS2015 中运行良好。
如果像这样更改代码也是可行的
int i = 3;
do
{
try
{
throw new Exception();
}
catch (Exception) when (--i > 0)
{
Thread.Sleep(10);
}
} while (true);
这将更适合现实世界的例子(因为展开堆栈)
【问题讨论】:
-
我刚刚在 VS 2015 中新创建的 web 表单 asp.net 项目中尝试了它,一切都按预期工作。似乎您的特定配置受到影响(或者在为 SO 采用代码时,您意外删除了错误部分)。但无论如何,以这种方式使用过滤器是个坏主意。
-
你尝试发布配置吗?
-
创建一个测试project
-
是的,在发布和调试中工作正常
标签: c# asp.net exception-handling c#-6.0