【问题标题】:SQL Exception is not being caught as a SqlExceptionSQL 异常没有被捕获为 SqlException
【发布时间】: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


【解决方案1】:

您的 Sql 连接器确定您的连接未打开,因此在尝试与 Sql 服务器通信之前它会抱怨它。

因此,您得到的是 InvalidOperationException 而不是 SqlException,因为 Sql 服务器没有抛出异常。实际上根本没有涉及到Sql server。

这与远程关闭连接不同,后者将act differently

【讨论】:

  • 这是我已经回复过的相同答案。请通过编辑适当地提供您的贡献,我将包括它。谢谢。
  • @Elaskanator 我的贡献是什么意思?我提供了为什么您会看到一个异常而不是另一个的原因。如果它不是由 Sql 抛出的,那么它可能不是 Sql 异常。远程关闭的连接由 sql 关闭并由 Sql 抛出,因此它与手动关闭不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2016-11-04
  • 2013-08-08
  • 2019-08-30
相关资源
最近更新 更多