2014-01-29 25 views
0

我編譯由於某種原因停止捕獲異常的控制檯應用程序趕上例外。作爲測試,我把以下內容:VB.NET的try/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 

(其中寫進程是我寫來控制日誌輸出的自定義類)所以,當我運行它在目標機器上編譯EXE(沒有Visual Studio中會發生什麼)?我得到的線「測試:」在日誌中,則:

未處理的異常:System.NullReferenceException:對象不設置到對象的實例。

爲什麼?我做了什麼來禁用異常處理?

+3

莫非的'Log'對象是某種缺陷,使得'Log.Log'本身拋出NRE?第一次調用會拋出一個會被捕獲的異常,但是Catch處理程序本身內的調用會拋出另一個異常,並且這個異常不會被捕獲。 – supercat

+0

這完全正常,b.ToString()方法因N爲無效而失敗,因爲NRE。如果你希望從零分中得到一個例外,那麼這是無望的希望,這是有效的,並有一個明確定義的Infinity結果。超越。 –

+0

是的,我把這兩行故意生成一個異常,問題在於Catch沒有捕獲它。這讓我瘋狂,我無法弄清楚爲什麼Try/Catch在整個項目中不再工作。我創建了一個全新的項目,添加了所有代碼,並展現出相同的行爲;但如果我在同一個解決方案中使用全新的代碼創建一個全新的項目,它會捕獲異常並在Catch塊中處理。如果我刪除Try/Catch並使用On Error GoTo,則確實會捕獲異常。 –

回答

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塊在引發時無法處理它。該程序在調試和運行時都提供了未處理的異常。但是,使用On Error GoTo替換Try/Catch將起作用。這不是一個選項,因爲我有很多嵌套的Try/Catch塊,整個代碼工作了4年。 –

0

就我而言,我的應用程序需要操縱AutoCAD圖紙。添加對名稱空間Autodesk.AutoCAD.Runtime的引用由於某種原因中斷了try/catch機制。我刪除了該名稱空間,並將引用保留給其他名稱空間,並且它可以工作。