SQL 异常未作为 SqlException 被捕获
SQL Exception is not being caught as a SqlException
我正在尝试为我观察到的持久性应用程序添加一些重试功能,该应用程序由于 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
变量进行更多分析是合适的。
您的 Sql 连接器确定您的连接未打开,因此它会在事件尝试与 Sql 服务器通信之前抱怨它。
因此您得到的是 InvalidOperationException
而不是 SqlException
,因为异常不是由 Sql 服务器抛出的。事实上 Sql 服务器根本没有参与。
这与远程关闭连接不同,后者将 act differently。
我正在尝试为我观察到的持久性应用程序添加一些重试功能,该应用程序由于 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
变量进行更多分析是合适的。
您的 Sql 连接器确定您的连接未打开,因此它会在事件尝试与 Sql 服务器通信之前抱怨它。
因此您得到的是 InvalidOperationException
而不是 SqlException
,因为异常不是由 Sql 服务器抛出的。事实上 Sql 服务器根本没有参与。
这与远程关闭连接不同,后者将 act differently。