簡體   English   中英

捕獲異常,添加數據並重新拋出它

[英]Catch Exception, add data, and rethrow it

我有以下代碼:

try
{
   OnInitialize();
}
catch (PageObjectLifecycleException exception)
{
   exception.OldLifecycleState = CurrentLifecycleState;
   exception.RequestedLifecycleState = LifecycleState.Initialized;
   throw exception;
}

我捕獲一個異常,向它添加更多數據,然后重新拋出它。 Resharper警告我(正確地)可能需要重新拋出並建議將其更改為:

throw;

但我想知道:這是否正確地重新修改修改后的異常或未經修改的原始異常?

編輯 :回應“試一試”評論:我是C#的新手,來自C ++。 在C ++中,你經常會在這樣的極端情況下發現未定義的行為,我感興趣的是我想要的是它是如何正式工作的。

您可以將額外信息添加到數據中並使用throw重新拋出異常,以便保持其原始形式和callstack

try
{
   ...
}
catch (PageObjectLifecycleException exception)
{
   exception.Data.Add("additional data", "the additional data");
   throw;
}

我知道已經選擇了答案但是這里有關於這個主題的更多信息。

try {
    // code
}
catch(Exception e) {
    throw e;
}

當編譯成IL上面的代碼將產生一個呼叫給throw傳遞一個參考處理的異常作為參數。 您可能已經意識到,您可以從代碼中的任何位置調用throw來引發異常。

try {
    // code
}
catch(Exception e) {
    throw;
}

編譯成IL時上面的代碼將產生一個rethrow的調用。 這是不同的,以throwrethrow來的信號,在該異常被處理該塊出於某種原因決定不處理它,因此,責任應給予高階catch塊(下一個了)。

rethrow方法保留當前的調用堆棧跟蹤,以便可以跟蹤異常的來源。 但是, throw方法啟動一個新的調用堆棧跟蹤。 一旦你理解了兩種方法的用途,我認為這是有道理的。

根據我的經驗,你使用throw exception; 當你想出於某種原因拋出異常時(例如對象的驗證失敗)你會使用throw; 在執行一些日志記錄之后的catch語句中(即,在將異常處理職責傳遞到更高級別之前,您仍然可以訪問驗證失敗的對象中的有用信息)。

在您的示例中,我建議如果您需要向異常添加更多信息,您可以創建一個全新的異常並提升它。 所以你會使用throw exception; 方法,其中“exception”是包含額外信息和最初拋出的異常的新異常。

希望有所幫助!

詹姆士

它將拋出對修改后的異常的引用。

但是我不確定這是不是很好的編程風格。 考慮創建一個新的異常並將PageObjectLifecycleException添加為其內部異常。 這樣處理代碼可以確定它是否具有正確的附加信息。

當前的異常被重新拋出,雖然我不確定你的模式是一個非常好的和可維護的模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM