2010-04-23 96 views
1

爲什麼我的try-catch塊在處理時仍然會拋出錯誤?爲什麼會在我的try-catch中拋出一個錯誤?

異常詳細信息: System.NullReferenceException:對象 參考不設置到 對象的實例。

   Try 
    Here >> : _MemoryStream.Seek(6 * StartOffset, 0) 
       _MemoryStream.Read(_Buffer, 0, 6) 
       Catch ex As IOException 
       // Handle Error 
       End Try 

編輯:清理的問題,將其取出的無關信息。

回答

6

該應用程序在try-catch塊內的 行上爆炸。任何 想法爲什麼會發生這種情況? 不應該只是默默地失敗嗎?

爲什麼你認爲try/catch中不會發生異常? try.catch塊的全部用途是定義你打算如何處理異常情況。如果沒有與所拋出的異常類型相對應的catch塊,則異常將傳播出去,直到某個代碼捕獲它或直到它被提升爲未處理爲止。

當然,可以使用Catch ex as Exception作爲塊來捕獲所有異常,然後吞下它們,但這不是一個好主意。

只要NullReferenceException去,你幾乎永遠不想抓住他們,並處理他們(幾乎從不)。它們通常表示代碼中存在一處錯誤,即在訪問其上的方法或屬性之前邏輯未測試null的引用。事實上,很可能_MemoryStream變量本身就是罪魁禍首 - 如果它是空的,那麼在它上調用一個調用就會引發這個確切的異常。

6

由於try/catch塊僅捕獲IOException,因此它不會捕獲NullReferenceException

這可能表示程序中發佈的代碼之外的某種邏輯錯誤。而對於這種例外情況,程序不應該默默地失敗 - 這可能是代碼中的錯誤或庫的使用方式(雖然它可能應該由庫處理),不是運行時環境的問題。

0

因爲引發的異常不是IOException。你需要捕獲所有異常。

0

沒有什麼可以說漁獲能捕捉所有的異常;它可能會被限制在一個特定的例外類別中,但不包括這個例外。即使它正在捕捉這類異常,它可能會重新拋出異常。當正確完成(即throw;)時,重新拋出將顯示拋出異常的捕獲行中的異常。

1
  1. Try-Catches通常不會在默默地失敗。只是爲了澄清這一點。

  2. _MemoryStream null(或Nothing)在代碼中的那一點?嘗試抓住幾乎從來沒有被用來處理NullReferenceException
    在這種情況下它不捕獲NullReferenceException,因爲NullReferenceException不是IOException

1

發生這種情況是因爲您只捕獲System.IOException類型的異常,並且引發的異常是System.NullReferenceException。要抓住它,你需要這樣做:

Try 
    _MemoryStream.Seek(6 * StartOffset, 0) 
    _MemoryStream.Read(_Buffer, 0, 6) 
Catch ex As IOException 

Catch ex As NullReferenceException 
    ' Exception would be caught and handled here. 
End Try 
1

我不是vb.net專家,但一個空引用異常不是一個IOException,所以異常落空,不得以更高的被抓水平。如果將IOException作爲異常來捕獲,那應該可以做到,儘管不是最佳實踐。

+0

這不僅不是最好的做法,它實際上總是一個錯誤。 – 2010-04-23 19:53:19

0

Catch正在捕獲IOException(僅)。拋出的異常是NullReferenceException。

+0

哇。在我輸入我的答案的時間裏有7個其他答案。 :) – 2010-04-23 19:52:15

相關問題