2011-02-14 5 views
1

어떻게 이것을 잡을 수 있습니까? TypeInitializationException? 그것이 C# 또는 VB.NET 코드인지 정말로 신경 쓰지 마라.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 

한다고 가정 내가 CreateObj 방법을 통제 할 수 없습니다 : - 여기에 내가 알아 내려고 노력하고있는 무슨의 몇 가지 예제 코드는 (내가 처리하고 무엇을 보여 뭔가이 실제 코드가 아닙니다)입니다.

답변

1

VB에서는 응용 프로그램 유형에 따라 몇 가지 옵션이 있습니다.

응용 프로그램이 콘솔 응용 프로그램 또는 Windows 양식 응용 프로그램 인 경우 My 클래스를 UnhandledException 이벤트로 확장 할 수 있습니다.

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에 초기 값을 설정하십시오.

+0

이것이 Windows 양식에 있다면? – Denis

+0

죄송합니다. 상단의 예는 console & windows forms입니다. 나는 그 게시물을 고쳤다. 그냥 클래스 파일을 프로젝트에 추가하고 파일에 가기 예제를 넣어 당신은 설정해야합니다. –

0

다른 예외와 마찬가지로 Try/Catch 블록을 사용하십시오. Main이 프로그램 진입 점이면 예외를 잡을 기회가 있기 전에 예외가 발생할 수 있으므로 운이 좋지는 않습니다. 나는 VB에서 타입 초기화에 관한 규칙에 대해 확신하지 못하기 때문에 "might"라고 말합니다. C# 4와 동일하다면 실제로 초기화 될 때까지 형식 이니셜 라이저가 실행되지 않고 코드에서 필요하지 않습니다 (testObj는 사용되지 않기 때문에).

+0

"및 코드에서 필요하지 않습니다."- Shared (C#의 정적) testObj 필드가 초기화되어 Main 메서드가 실행되기 전에 CreateObj가 호출됩니다. 그래서 필요합니다. – Joe

+0

Main 메서드가 정적 필드에 액세스하지 않는 한 C# 4에 해당 코드를 작성하고 CreateObject가 호출되지 않았습니다. 그러나 규칙은 VB에서 다를 수 있습니다 ... –