我试图向一些永久性应用程序添加一些重试功能,该应用程序由于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
块中放置一个断点,并手动关闭连接以测试错误处理。
但是它最后直接跳到通用Exception catch块,完全绕过SqlException
上的重试捕获。
捕捉SQL异常在做什么?
我意识到,如果调用了预期的catch
块,则对slqEx
变量的更多分析将是适当的。
答案 0 :(得分:0)
您的Sql连接器确定您的连接未打开,因此在尝试与Sql服务器通信之前会抱怨该连接。
因此,您得到的是InvalidOperationException
而不是SqlException
,因为Sql服务器未引发异常。实际上,根本不涉及Sql Server。
这与远程关闭的连接不同,后者将act differently。