【问题标题】:Is there a way to catch these Exceptions?有没有办法捕捉这些异常?
【发布时间】:2011-02-04 03:25:58
【问题描述】:

有没有办法捕捉这些异常? (我不是在寻找“只是在它们周围放置 try/catch 或错误 goto”)。我正在尝试找出这些错误是否可以被它们之外的东西捕获。

Public Class ABC
   Shared Sub New()
     throw new Exception("Ha!")
   End Sub
End Class

或者这个:

Public Class ABC
  Dim obj as Object = CreateObject()

  Public Function CreateObject()
    throw new Exception("Ha!")
  End Function
End Class

顺便说一句,将这些放在我的启动类(它是一个 Windows 窗体)中作为“Shared Sub New()”中的第一行不起作用:

AddHandler Application.ThreadException, AddressOf Application_ThreadException
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf CurrentDomain_UnhandledException

【问题讨论】:

  • 在公共场合提及“On Error Goto”是不礼貌的;)不要再这样做了。
  • 它们可以在调用堆栈的任何级别被捕获。也许我不明白你在问什么。
  • @Fantius:第一个是在静态构造函数中抛出的,这使它比这更复杂一些。但是第二个可以在你做new ABC()的任何地方被捕获,因为它被抛出在构造函数中。
  • 啊,我没有注意到它是一个静态构造函数。
  • 我无法想象为什么您需要在可能引发异常的静态(共享)构造函数中执行某些操作。

标签: .net vb.net exception-handling


【解决方案1】:

看到这个:
http://temujin.blogsome.com/2006/03/15/static-constructors-and-exceptions/(现在已经死了 - archive)

要点:

如果发生异常,运行时将始终将其包装在 TypeInitializationException 中

因此请尝试在应用程序/AppDomain 级别查找 TypeInitializationException。另外:

静态构造函数只被运行时执行一次,当类型被初始化时;第二次访问静态字段时,将再次抛出初始异常

简而言之 - 不要做任何可能在静态(共享)构造函数中引发异常的事情。将代码移至静态属性或方法或实例构造函数。

【讨论】:

  • 这是一个有趣的想法,但没有事件可以捕捉到这一点。你能举一个我可以订阅的 TypeInitializationException 的例子吗?正如您可以想象的那样,我不能在第二种情况下尝试/捕获。不知道我应该从哪里去......
猜你喜欢
  • 1970-01-01
  • 2013-04-20
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多