尝试多种捕获行为

时间:2014-04-24 14:55:33

标签: vb.net error-handling data-access

给出类似的代码:

Try
    Try
        'Code that throws an OleDBException
    Catch dbEx as System.Data.OleDb.OleDbException
        Console.WriteLine("Inner Specific Exception handler.")
        Dim newEx As New System.Exception("Database Error Handled.", dbEx)
        Throw newEx
    Catch ex as Exception
        Console.WriteLine("Inner Generic Exception handler.")
    End Try
Catch ex as Exception
    Console.WriteLine("Outer Generic Exception handler.")
End Try

这段代码已经缩减了很多,实际的实现更多地使用OleDBException然后丢失堆栈跟踪但我的问题是,当抛出OleDbException时将写入控制台的内容?

我希望看到:

Inner Specific Exception handler.
Inner Generic Exception handler.

但我认为它实际上会输出:

Inner Specific Exception handler.
Outer Generic Exception handler.

或者是否有人知道一种确定的火力方式会导致OleDbException一直被抛出,所以我可以自己测试一下?

2 个答案:

答案 0 :(得分:0)

你不能轻易抛出OleDBException,因为它说不能访问友元构造函数,但为什么不用更简单的异常类型测试呢?异常类型不会对您的测试产生影响。

  Try
     Try
        Throw New ArgumentException("Throwing up!")
        'Code that throws an OleDBException
     Catch dbEx As ArgumentException
        Console.WriteLine("Inner Specific Exception handler.")
        Dim newEx As New System.Exception("Database Error Handled.", dbEx)
        Throw newEx
     Catch ex As Exception
        Console.WriteLine("Inner Generic Exception handler.")
     End Try
  Catch ex As Exception
     Console.WriteLine("Outer Generic Exception handler.")
  End Try

答案 1 :(得分:0)

看来OleDbException类的构造函数不是公共的,所以你可能无法自己抛出一个。

但是,您可以通过您知道将失败的OleDB连接执行查询来实现您的目标。例如:

SELECT NoColumn FROM NoTable

应该这样做,除非你不幸得到一张名为" NoTable"使用名为" NoColumn"的列。 :)