2011-02-14 75 views
1

我怎樣才能知道TypeInitializationException?不關心它是否是C#或VB.NET代碼。這裏是什麼,我試圖找出一些示例代碼(這不是真正的代碼 - 只是要證明什麼,我與買賣):我有過CreateObj方法無法控制如何捕獲TypeInitializationException?

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 

假設。

回答

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 Web應用程序,然後添加一些代碼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中設置初始值。

0

只需使用一個Try/Catch塊,作爲任何其他異常...如果Main是程序的入口點,你的運氣了,因爲你有機會追上它之前可能會引發異常。我說「可能」,因爲我不確定有關VB中類型初始化的規則;如果它們與C#4中的相同,則發佈的代碼將運行良好,因爲在實際需要之前,類型初始化程序將不會執行,並且在代碼中從不需要(因爲testObj從不使用)

+0

「並且在你的代碼中它永遠不需要」 - 在執行Main方法之前,SharedObjects(static in C#)testObj字段將被初始化,因此將調用CreateObj。因此,有必要。 – Joe 2011-02-14 19:58:17

+0

我在C#4中編寫了等效代碼,除非Main方法訪問靜態字段,否則不會調用CreateObject。但是規則在VB中可能不同...... – 2011-02-14 20:29:38

相關問題