2014-01-29 2 views
0

어떤 이유로 든 예외를 포착하는 콘솔 응용 프로그램을 컴파일 중입니다. 테스트로, 나는 넣어 다음VB.NET Try/Catch가 런타임에 예외를 catch하지 않습니다.

Sub Main() 
    Try 
     Log = New LogWriter("C:\app.log") 
     Log.Log("Test:") 
     Dim a As Single = 5/0 
     Dim b As Object 
     Log.Log(b.ToString) 
    Catch exTest As Exception 
     Log.Log("Caught exception") 
    End Try 
End Sub 

그래서 (LogWriter 내가 출력 로그 제어하기 위해 작성한 사용자 정의 클래스 임) 내가 대상 컴퓨터에서 컴파일 된 EXE (비주얼 스튜디오로 실행하면 어떤 일이 발생)? 로그에서 "Test :"줄을 얻은 다음

처리되지 않은 예외 : System.NullReferenceException : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다.

왜? 예외 처리를 비활성화하려면 어떻게해야합니까?

+3

'Log' 객체가 어떻게 든 결함이있어'Log.Log' 자체가 NRE를 던집니까? 첫 번째 호출은 catch 될 예외를 throw하지만 Catch 처리기 자체의 호출은 다른 예외를 throw하고 catch되지 않습니다. – supercat

+0

이것은 모두 완전히 정상이며 b가 Nothing이기 때문에 b.ToString() 메서드는 NRE로 실패합니다. 만약 당신이 제로에서 예외를 얻고 싶다면 그것은 유휴 희망이었습니다. 그것은 유효하고 잘 정의 된 Infinity 결과를 가지고 있습니다. 이후. –

+0

예, 예외를 생성하기 위해이 두 줄을 넣었습니다. 문제는 catch가 catch하지 않는다는 것입니다. 저를 미치게 만들었습니다. 왜 Try/Catch가 프로젝트 전체에서 더 이상 작동하지 않는지 알 수 없습니다. 나는 새로운 프로젝트를 만들고, 모든 코드를 추가했으며, 같은 행동을 보였다. 그러나 동일한 솔루션에서 새로운 코드로 새로운 프로젝트를 만들면 Catch 블록에서 예외를 catch하고 처리합니다. Try/Catch를 제거하고 On Error GoTo를 사용하면 예외가 catch됩니다. –

답변

1

회전율 무한대는 부동 소수점에 유효한 값입니다.

Private Sub Test_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click 
    Try 
     Log("C:\app.log") 
     Dim a As Single 
     a = 5/0 
     Log("Test zero: " & a) 
     Dim b As Object 
     Log(b.ToString) 
     Log("Test null") 
    Catch exTest As Exception 
     Log("Caught exception" & vbCrLf & exTest.Message) 
    End Try 
End Sub 
Sub Log(msg As String) 
    Debug.Print(msg) 
End Sub 

결과 :

C:\app.log 
Test zero: Infinity 
Caught exception 
Object reference not set to an instance of an object. 

b는 따라서 오류를 인스턴스화되지 않았습니다.

+0

문제 설명을 읽은 경우 코드에서 예외가 발생하는 이유를 알 필요가 없습니다. 왜 Catch 블록이 발생시킬 때이를 처리하지 않는지 알고 싶습니다. 디버그와 런타임 모두에서 프로그램은 처리되지 않은 예외를 제공합니다. 그러나 Try/Catch를 On Error GoTo로 바꾸는 것이 효과적입니다. 4 년 동안 잘 작동 한 코드에서 Try/Catch 블록을 많이 중첩했기 때문에이 옵션이 아닙니다. –

0

필자의 경우, 내 응용 프로그램은 AutoCAD 도면을 조작해야했습니다. 네임 스페이스에 대한 참조를 추가하면 Autodesk.AutoCAD.Runtime이 어떤 이유로 try/catch 메커니즘을 방해했습니다. 네임 스페이스를 제거하고 다른 네임 스페이스에 대한 참조를 남겨두면 작동합니다.

관련 문제