當程序中出現意外的異常時(在調試器中)。有時你只是想跳過它,因爲在那個時候殺死程序比持續更有害。或者你只是想繼續,因爲你對另一個錯誤/ bug更感興趣有沒有辦法在C#中繼續異常?
有沒有一個選項/ compilerflag/secretswitch來啓用它?
我明白異常應立即解決,但也有情景(如我所描述的),其中一個只是想跳過它的時間是
當程序中出現意外的異常時(在調試器中)。有時你只是想跳過它,因爲在那個時候殺死程序比持續更有害。或者你只是想繼續,因爲你對另一個錯誤/ bug更感興趣有沒有辦法在C#中繼續異常?
有沒有一個選項/ compilerflag/secretswitch來啓用它?
我明白異常應立即解決,但也有情景(如我所描述的),其中一個只是想跳過它的時間是
如果在代碼中沒有適當的catch塊,則不能這樣做。但是,我不記得曾經想要這麼做:如果發生了一個你的代碼不知道如何真正處理的異常,爲什麼你還想繼續?那時你處於不良狀態 - 繼續會很危險。
你能舉一個例子說明爲什麼你想要在調試器會話中繼續而不是在生產代碼中?
使用try-catch塊,並追趕時,唐對例外做任何事情。
這是行不通的。沒有捕獲或最後的try是無效的,並且在發生異常時,不執行任何操作的try/catch塊將不會繼續執行try
在調試模式下逐句通過代碼時,可以跳過執行引發不期望異常的指令。但是如果這個異常已經被拋出,並且你沒有try/catch,它將會傳播。
查看Exception Handling Application Block和相關文檔。它包含處理應用程序異常的最佳實踐,併爲您完成了大量框架代碼,即日誌記錄。
如果你想知道你想允許什麼異常。那麼你可以這樣做下面
try
{
// your functionality
}
catch(Exception ex)
{
// Catch only the exceptions you need to point out
}
finally
{
//do what you want to complete with this function.
}
我假設通過「跳過」你的意思是你希望你的程序在異常後繼續工作。 當然,使用try-catch塊時捕捉異常是可能的。
如果異常不是應用程序停止(例如,某些關鍵變量未在異常後初始化,並且無法繼續工作),建議您至少在繼續之前將其記錄下來。當然,把
趕上(例外五){}
無處不在源不會導致一個穩定的應用;)
如果您的問題是多個調試相關(你不希望調試器停止每一個拋出的異常),那麼在VS中有一個地方你可以改變它:
在調試菜單,請選擇例外。您將看到所有可能的例外情況,並且您可以調整其在用戶處理或不處理時的行爲。
是的,我知道如何捕捉異常。我的問題是關於其被拋出,但我忘了捕捉和調試抓住了它是一個例外......這一次我想繼續,但我不能 – Toad 2009-12-16 10:02:49
你的意思是,你有你的生產環境中的應用程序,您現在無法改變源代碼。你想通過跳過那個異常來使它工作嗎? 如果是這樣的話,嗯。不確定您是否可以告訴虛擬機「不要拋出此異常」... – Danail 2009-12-16 10:37:48
danail:已經拋出異常並且調試器捕獲了它...現在我唯一能做的就是查看一些變量,然後退出應用程序/調試器。我想(如果一個愚蠢的異常無論如何都不重要)能夠讓程序繼續運行(從下一行/塊開始) – Toad 2009-12-16 13:55:34
例外在C#中是不可恢復的,但事件 - 這是例外如何可恢復通常被實現:爲cancellable events。另見this question。
我偶然發現了這一點 - 如果第一個異常對於實際調試的問題並不重要,那麼您可能需要繼續。在這種情況下,您可以將狀態重置爲異常之前,然後跳過引發異常的步驟。通過VS 2010中的臨時調試,這可能會變得更容易:)但是,一般來說,您是對的,無論如何您遲早都必須處理第一個異常。 – OregonGhost 2009-12-16 09:49:10
@jon:非常正確....但我有這個錯誤,只發生在生產環境中。所以我連接了調試器......並且是有未捕獲的異常。而且這還不算什麼大事,所以我寧願讓事情先把它做好,然後乾脆停止程序修復異常並將其恢復。 – Toad 2009-12-16 09:59:59
@oregon:是的......調試器捕捉到它的事實......表明程序仍然在那裏漂浮......並且可能讓它繼續。 (就像斷言有這個選項) – Toad 2009-12-16 10:01:11