【发布时间】:2021-12-24 17:10:33
【问题描述】:
我知道2019 Microsoft created Microsoft.Data.SqlClient 是 System.Data.SqlClient 的替代品。 System.Data.SqlClient 将得到持续支持,但新的开发和功能都将在 Microsoft.Data.SqlClient 中。这两个库都有一个名为“SqlException”的类。
假设我在任何地方都在使用 Microsoft.Data.SqlClient,那么可能相关的异常将是 Microsoft.Data.SqlClient.SqlException 类型,但是我使用了一堆 3rd-party 库,怎么能我确定他们会提出Microsoft.Data.SqlClient.SqlException 还是System.Data.SqlClient.SqlException?这是否意味着在某些情况下我有 Microsoft.Data.SqlClient.SqlException 的捕获处理程序,我还应该检查 System.Data.SqlClient.SqlException?还是发生了什么聪明的事情,这意味着我只需要考虑 Microsoft.Data.SqlClient.SqlException?
例如我有一些旧代码,有点像我在下面显示的,是在我们开始使用 Microsoft.Data.SqlClient 之前编写的。我担心如果我只是将其更改为使用 Microsoft.Data.SqlClient 则会出现一些 System.Data.SqlClient.SqlException 异常,而我的代码将不再注意到它们。
private static bool HandleSqlExceptionInSomeWay(Exception ex)
{
var se = ex as System.Data.SqlClient.SqlException;
if (se != null)
{
// ... do something with the SqlException
return true;
}
return false;
}
所以我应该把它改成这样,即分别检查不同的类型吗?
private static bool HandleSqlExceptionInSomeWay(Exception ex)
{
// handle old SqlExceptions (e.g. from any old
// libraries not using MS package yet)
var se1 = ex as System.Data.SqlClient.SqlException;
if (se1 != null)
{
// ... do something with the SqlException ...
return true;
}
// handle shiny new SqlExceptions
var se2 = ex as Microsoft.Data.SqlClient.SqlException;
if (se2 != null)
{
// ... do something with the SqlException ...
return true;
}
return false;
}
【问题讨论】:
-
尽可能使用新库。大多数 NuGet 包已经使用
Microsoft.Data.SqlClient.SqlException。 -
how can I be sure whether他们使用哪个包?如果他们使用旧库,请升级到使用新库的版本。 -
我想如果你只是捕捉
Microsoft.Data.SqlClient.SqlException,你的“捕捉所有全局日志记录处理程序”将开始看到System.Data.SqlClient.SqlException,如果依赖项正在抛出它? -
理论上,库应该记录其方法可以抛出的异常类型(例如,使用
<exception cref="...">xmldoc)。这将是方法契约的一部分,因此,更改这将是一个重大更改,需要在语义版本控制中使用新的主要版本号,并在发行说明中提及。然而,在实践中,理论和实践并不总是一致... -
顺便说一句,您的
var se1 = ex as System.Data.SqlClient.SqlException; if (se1 != null)可能更易读为if(ex is System.Data.SqlClient.SqlException sex) ...
标签: c# sql-server