我知道大约在2019年,Microsoft创建了Microsoft.Data.SqlClient作为System.Data.SqlClient的替代品。System.Data.SqlClient将继续受到支持,但新的开发和功能将全部在Microsoft.Data.SqlClient中进行。这两个库都有一个名为 'SqlException' 的类。
假设我在所有地方都使用Microsoft.Data.SqlClient,那么相关的异常应该是Microsoft.Data.SqlClient.SqlException类型,但是我使用了许多第三方库,我怎么确定它们是否会引发Microsoft.Data.SqlClient.SqlException或System.Data.SqlClient.SqlException?这是否意味着在我有一些为Microsoft.Data.SqlClient.SqlException编写的catch处理程序的情况下,我也应该检查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;
}
Microsoft.Data.SqlClient.SqlException
。 - Panagiotis KanavosMicrosoft.Data.SqlClient.SqlException
,那么如果依赖项抛出System.Data.SqlClient.SqlException
,你的“全局日志处理程序”也会开始看到它? - Caius JardSystem.Data.Common.DbException
。 - DavidG<exception cref="...">
xmldoc)。这将是方法合同的一部分,因此更改它将是一个破坏性的变化,需要在语义版本控制中使用新的主要版本号,并在发布说明中提到。然而,在实践中,理论和实践并不总是一致的... - Heinzivar se1 = ex as System.Data.SqlClient.SqlException; if (se1 != null)
可以更易读地写成if(ex is System.Data.SqlClient.SqlException sex) ...
- Caius Jard