2012-05-13 27 views
0

拋出這可能是一個調試器的問題,但在這裏有雲:時拋出定製的異常會立即陷入了同樣的catch塊是從

我有這樣一段代碼:

Private Function Connect() As Boolean 
    Try 
     sessionBegun = False 
     connectionOpen = False 

     rp = New RequestProcessor2() 

     rp.OpenConnection2("","EZSystem", QBXMLRPConnectionType.localQBD) 

     connectionOpen = True 
     ticket = rp.BeginSession("", QBFileMode.qbFileOpenDoNotCare) 
     sessionBegun = True 

     Return True 
    Catch e As COMException 
     exceptionHandler.HandleConnectionException(e) 
     **Throw New QuickBooksConnectionException(e.Message)** 
    End Try 
End Function 

我的本意是把低層異常「轉化」爲更有意義的東西,所以我拋出了我自己創造的例外。我希望這可以泡到我可以處理的地方。

但是,發生了什麼事是我的調試器中斷,並告訴我,「QuickBooksConnectionException」類型的異常被拋出。

我知道,我只是扔了它,你爲什麼抓住它?

從我讀過的,這應該工作,並且似乎沒有類似的Java引發關鍵字,所以也許它是我的調試器。

我正在使用SharpDevelop。

感謝, 丹麥

+1

這只是調試器的工作。它捕獲任何未處理的異常。你期望發生什麼? – MarkJ

+0

我曾期待它會向呼叫者冒泡,然後在那裏爆炸。 – Danedo

+1

它調用調用堆棧尋找封閉的Try塊。如果沒有封閉Try塊,那麼你將得到未處理的異常行爲。這意味着如果您正在調試器*下運行*,調試器會將回調堆棧回退,以便向您顯示拋出異常的原始行。幫助您調試發生異常的原因。嘗試從獨立的EXE運行。它將以標準錯誤對話結束。我認爲你的代碼工作正常,只是調試器可能讓你感到困惑。 – MarkJ

回答

1

書面,你的代碼拋出未處理的異常,它總是會導致調試在所不惜。您只需在調用此方法的代碼中捕獲QuickBooksConnectionException。 (你說得對,在C#中沒有與一起拋出 Java關鍵字的等價物。)

+0

你似乎暗示着拋出一個自定義的異常是個壞主意,就像他正在做的那樣。他沒有做錯什麼。事實上,他所做的是在許多方面的良好實踐。僅僅因爲調試器在那個時候中斷了,給你一個跟蹤代碼的機會,看看拋出異常的原因,這並不意味着拋出異常是錯誤的編碼習慣。 –

+0

@SteveDog我不認爲我暗示這是不好的做法;我同意這是正確的方法來拋出異常備份堆棧,如果你無法處理它被捕獲的地方。 – McGarnagle

1

您可以更改調試器中止異常的設置。

See here.

+0

+1。以下是確定調試器是否打破異常的規則http://msdn.microsoft.com/zh-cn/library/x85tt0dd – MarkJ

0

這僅僅是一個調試器做的工作。它通常捕獲任何未處理的異常。我認爲你的代碼工作正常,這是可能讓你感到困惑的調試器。

這裏有一個實驗來展示發生了什麼。完全刪除您的Try-Catch塊。運行代碼&會導致COMException。調試器會「捕捉」它,因爲它是未處理的,並突出顯示它所拋出的線。

異常冒出了調用堆棧尋找一個封閉的Try塊。如果沒有封閉Try塊,則運行時會處理它。這意味着如果您在調試器下運行,則調試器會將回調堆棧回退,以便它可以顯示拋出異常的原始行。幫助您調試發生異常的原因。嘗試從沒有調試器的獨立EXE或網站運行。它將以標準錯誤對話結束。

這裏是rules決定調試器是否打破例外。

相關問題