处理 ODBC, OLE DB, 和 SQL Server .NET Provider 中的异常
经常有使用 ODBC, OLE DB, 或者 SQL Server .NET Provider 的程序员询问,是否有一个处理过程中的完整的异常处理列表可以参考。这里可以提供一些参考帮助。
异常用来防止程序崩溃,并且应该提供一些相关的提示给用户。
首先,你可以通过数据库的事务来保证操作的一致性,这里可以通过 System.Transaction.TransactionScope 或者 ODBC, OLE DB, 和 SQL Server 连接对象中的提供的 BeginTransaction 方法来启动事务处理,确认数据的一致性,这样即使 Provider 抛出异常,事务失败,我们可以在程序中捕捉到异常,然后重试事务。
每一个数据提供器都有一个提供器特有的异常类,用来报告特定的数据库错误信息,例如,对于常用的 System.Data.SqlClient 来说,就是SqlException 类,错误的详细内容,可以通过这些异常对象的成员来获得,例如 Message 属性通常提供一个字符串形式的详细错误信息。
除了数据提供器的特定异常, 还可能抛出 .NET Framework 异常,例如内存耗尽的异常 System.OutOfMemoryException 和 线程终止的异常 System.Threading.ThreadAbortException,从这些异常中程序不太可能进行恢复操作。
另外,错误的输入也可能导致异常,例如:参数错误异常 System.ArgumentException 或者下标越界异常 System.IndexOutOfRangeException,可能出现在通过在 SQL 语句中通过参数对象传递参数的时候,在获取数据库返回结果的时候也可能会出现类型转换异常 System.InvalidCastException, 在错误的时间调用方法可能会出现 System.InvalidOperationException 异常。
因此,写一个异常处理程序来捕获数据提供器的特定异常,以及 CLR 的异常,可以如下进行:
2 {
3 // SQL Server 处理的代码
4 }
5 catch (SqlException SqlEx)
6 {
7 // 在这里处理捕获的 SQL Server 特定的异常
8 }
9 catch (Exception ex)
10 {
11 // 在这里处理普通的异常
12 }
或者
2 {
3 // Odbc code here
4 }
5 catch (Exception ex)
6 {
7 if (ex is SqlException)
8 {
9 // 在这里处理捕获的 SQL Server 特定的异常.
10 }
11 else
12 {
13 // 在这里处理普通的异常.
14 }
15 }
16
最后,在线程池中的线程还有一个特殊的情况,调用中的数据提供器方法也可能会失败,这种情况典型的出现在使用异步编程模式 APM 的时候,因为这时程序的执行不在用户线程上,那么,你需要注册一个应用程序域的 System.AppDomain.UnhandledException 的异常处理事件来进行捕获,以防止程序的崩溃。
2 currentDomain.UnhandledException
3 += new UnhandledExceptionEventHandler(MyHandler);
原文地址:Exception Handling in the .NET Framework Data Provider for ODBC, OLE DB, and for SQL Server
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?