【发布时间】:2018-06-21 17:09:25
【问题描述】:
我正在尝试为持久性应用程序添加一些重试功能,我观察到由于远程关闭 SQL 连接而随机崩溃。我无法调试它关闭的原因,但我可以看出它是暂时的并立即恢复。所以很自然地我写了这段受保护的代码:
try
{
//do stuff that sometimes requires use of SQL
}
catch (System.Data.SqlClient.SqlException sqlEx)
{
if (myConnection.State == System.Data.ConnectionState.Closed)
{
try
{
myConnection.Open();
}
catch (Exception ex2)
{
throw new Exception("Could not reconnect", ex2);
}
}
else
throw new Exception("Unhandled SQL exception", sqlEx);
}
catch (Exception ex)
{
throw new Exception("Unhandled exception", ex);
}
然后我在do stuff块中放了一个断点,并手动关闭连接以测试错误处理。
但它会直接跳到最后的通用异常捕获块,完全绕过SqlException 上的重试捕获。
我在捕获 SQL 异常方面做错了什么?
我意识到,如果调用了预期的 catch 块,则需要对 slqEx 变量进行更多分析。
【问题讨论】:
-
你检查强行关闭连接时抛出的实际异常是什么?
-
哎呀,这是
InvalidOperationException。我假设执行任何与 SQL 相关的错误都会引发SqlException(它甚至不是内部异常)。 -
也许您可以使用消息或其他内容来确定这实际上是
SqlException?如果您可以发布实际错误,我们或许可以帮助缩小范围 -
如果消息足够清晰,您可以捕获 InvalidOperationException 以及异常过滤器
catch(InvalidOperationException ioe) when (ioe.Message == "some message" ) {...},这样您只捕获您需要的实际异常。我之前陷入过这种情况,假设所有 sql ops 都抛出了 SqlExceptions——对于 also 抛出 InvalidOperationException 的 Zombied Transactions 也是不正确的 :-(
标签: c# sql-server exception-handling