如何捕获TypeInitializationException?

时间:2011-02-14 16:00:21

标签: c# .net vb.net

我怎样才能抓住这个TypeInitializationException?不关心它是C#还是VB.NET代码。下面是我想要弄清楚的一些示例代码(这不是真正的代码 - 只是显示我正在处理的内容):

Public Class Test 
    Public Shared testObj as Object = CreateObj()

    Public Shared Function CreateObj() as Object
         throw new Exception("Ha!")
    End Function

    Public Shared Sub Main()
       Dim i as Integer = 0
    End Sub
End Class

假设我无法控制CreateObj方法。

2 个答案:

答案 0 :(得分:1)

在VB中,根据应用程序的类型,您有几个选项。

如果应用程序是控制台应用程序或Windows窗体应用程序,那么您可以使用UnhandledException事件扩展My类。

Namespace My
    Partial Friend Class MyApplication
        Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException
           'Handle error here
        End Sub
    End Class
End Namespace

如果是ASP.Net网络应用程序,则将一些代码添加到Global.asax文件中(为简洁起见,下面的事件被截断)。

Public Class Global_asax
    Inherits System.Web.HttpApplication

    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        ' Fires when an error occurs
    End Sub

    Private Sub Global_asax_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Error
        'Catches all errors
    End Sub
End Class

通常,您不应该从类型初始值设定项中调用方法。使用类初始值设定项在Sub Main中设置初始值。

答案 1 :(得分:0)

只使用Try/Catch块,就像任何其他异常一样......如果Main是程序入口点,那你就不幸了,因为在你有一个例外之前可能会抛出异常有机会抓住它。我说“可能”因为我不确定VB中关于类型初始化的规则;如果它们与C#4中的相同,那么您发布的代码将运行正常,因为类型初始化程序在实际需要之前不会执行,并且在您的代码中它永远不必要(因为testObj从未使用过)