• 处理 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 的异常,可以如下进行:

     

     1 try
     2 {
     3       // SQL Server 处理的代码
     4 }
     5 catch (SqlException SqlEx)
     6 {
     7       // 在这里处理捕获的 SQL Server 特定的异常
     8 }
     9 catch (Exception ex)
    10 {
    11       // 在这里处理普通的异常
    12 }

    或者

     

     1 try
     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 的异常处理事件来进行捕获,以防止程序的崩溃。

     

    1 AppDomain currentDomain = AppDomain.CurrentDomain;
    2 currentDomain.UnhandledException 
    3       += new UnhandledExceptionEventHandler(MyHandler);

    原文地址:Exception Handling in the .NET Framework Data Provider for ODBC, OLE DB, and for SQL Server

  • 相关阅读:
    IOS开发---菜鸟学习之路--(二十四)-iOS7View被导航栏遮挡问题的解决
    IOS开发---菜鸟学习之路--(二十三)-直接利用键值对的方式来处理数据的感想
    IOS开发---菜鸟学习之路--(二十二)-近期感想以及我的IOS学习之路
    一口一口吃掉Hexo(六)
    一口一口吃掉Hexo(二)
    setSupportActionBar(toolbar)导致程序崩溃闪退
    【原创+译文】官方文档中声明的如何创建抽屉导航栏(Navigation Drawer)
    【文章内容来自《Android 应用程序开发权威指南》(第四版)】如何设计兼容的用户界面的一些建议(有删改)
    如何为按钮设置一组不同状态的颜色
    如何避免Activity 被杀死
  • 原文地址:https://www.cnblogs.com/haogj/p/1758151.html
Copyright © 2020-2023  润新知