何时使用Microsoft.Data.SqlClient.SqlException与System.Data.SqlClient.SqlException
处理方案说明
你给出的第二种同时检查两类SqlException的方案是当前阶段最稳妥的实现方式,目前不存在可以仅处理Microsoft.Data.SqlClient.SqlException就覆盖所有场景的机制,原因如下:
- 两个命名空间下的
SqlException是完全独立的类型,没有继承关系,也不支持互相转换。依赖旧版System.Data.SqlClient的第三方库抛出的异常,必然是旧版SqlException类型,仅捕获新版异常会直接漏掉这部分错误。 - 如需确认第三方库使用的SqlClient版本,可以直接查看项目的依赖项列表,或是在调试时捕获异常查看它的类型完整名称即可判断。
如果觉得两处异常分支的处理逻辑重复冗余,可以把公共处理逻辑抽离为单独的方法,避免重复编码,参考实现如下:
private static bool HandleSqlExceptionInSomeWay(Exception ex) { // 处理旧版类库抛出的异常 if (ex is System.Data.SqlClient.SqlException seOld) { return ProcessSqlException(seOld.Number, seOld.Message, seOld.Errors); } // 处理新版类库抛出的异常 if (ex is Microsoft.Data.SqlClient.SqlException seNew) { return ProcessSqlException(seNew.Number, seNew.Message, seNew.Errors); } return false; } /// <summary> /// 统一的SqlException处理逻辑 /// </summary> private static bool ProcessSqlException(int errorNumber, string message, dynamic errors) { // 你的原有异常处理逻辑 return true; }
长期优化建议
后续可以逐步排查项目依赖的第三方库:
- 优先升级仍在使用旧版
System.Data.SqlClient的第三方库到最新版本,大部分活跃维护的库已经完成了向新版Microsoft.Data.SqlClient的切换 - 对于不再维护、无法升级的第三方库,保留旧版
SqlException的处理分支即可
内容的提问来源于stack exchange,提问作者Rory
相关产品推荐
相关产品推荐

