2017-08-29 35 views
0

我有以下代碼:創建2個例外在finally塊

finally 
{ 
    if (!isDnsSet) 
    { 
     var exception = new Exception(<DNS-INFORMATION>); 
         localLog.TraceException(exception); 
         throw exception; 
    } 
} 

既然這樣,這個異常拋出太多的信息是不是特別需要讓他們看到用戶。我希望能夠使用我的localLog類登錄exception,但也會用更簡潔的消息拋出另一個異常。

我正在考慮用縮短的信息創建另一個異常,並且仍然使用我的類記錄原始的,更詳細的信息。

是否有這樣做的更優雅的方式或我只想做這樣的事情:

var shortException = new Exception(<short and sweet message>); 
var longException = new Exception(<not so short and sweet but still useful for other devs>); 
localLog.TraceException(longException); 
throw shortException; 
+1

如果你想記錄一個異常並拋出另一個異常,這可能是你可以得到的簡潔。我不得不說我在拋出異常時編輯異常的想法並不瘋狂 - 似乎應該在堆棧中做更高的決定,或診斷問題可能很困難。 –

+0

只有我想到從最後拋出異常的想法 - 不抓塊有點奇怪嗎? – Vladimir

+0

這是一個帶'try-> catch-> finally'的完整方法。我剛剛決定放棄這部分 –

回答

1

我認爲一個更清潔的方法是使較長的例外的例外:

finally 
{ 
    if (!isDnsSet) 
    { 
     var innerException = new Exception(<not so short and sweet but still useful for other devs>); 
     var exception = new Exception(<short and sweet message>, innerException); 
     localLog.TraceException(exception); 
     throw exception; 
    } 
} 

你所具有的選擇拋出的異常而這記錄異常之間的一致性通過這種方式,使診斷更容易。

+0

我很喜歡這個解決方案和@ dasblinkenlight的解決方案。你能否詳細說明爲什麼這會使事情保持一致? –

+0

當用戶報告問題時,他們報告他們可以看到的內容。如果他們看到的消息沒有完全反映在日誌中,則可能很難診斷問題。根據您記錄異常的方式,您可以記錄短消息_和_長消息。 –

+0

所以我想向他們展示'short'消息,但記錄'long'消息。我想知道如何有一個內在的例外可以幫助我,而不是我最初提出的方式? –

0

無法異常處理程序接收和處理longException和,作爲其功能的一部分,扔shortException ?

1

一種方法是創建自定義異常,該異常攜帶長和短消息。誰得到你的庫之外的例外用戶將訪問通過ExceptionMessage財產的短消息,而你TraceException方法將通過您的自定義異常提供了一個額外的屬性來訪問長版:

public class DetailedException : Exception { 
    public string DetailedMessage { get; } 
    public DetailedException(string longMessage, string shortMessage) : base(shortMessage) { 
     DetailedMessage = longMessage; 
    } 
} 

TraceException方法:

var message = (exception as DetailedException)?.DetailedMessage ?? exception.Message; 
+0

只是爲了提供更多的上下文 - 我有2個'finally'塊,其中將引發該異常(用於不同的原因)。那麼,使用這種方法,我可以創建2個不同的自定義異常,然後相應地記錄它們? –

+0

@ User5842您只需要一個自定義異常類。不同的'finally'塊會創建不同的實例,傳遞不同的詳細消息,這些消息將被相應地記錄下來。 – dasblinkenlight

+0

好的,這是有道理的。另外,你的意思是寫'DetailedMessage = longMessage;'? –