2013-03-17 23 views
4

有沒有一種方法可以得到Exceptions的相應錯誤代碼? 我需要拋出的異常錯誤代碼而不是它的消息,以便我基於錯誤代碼向用戶顯示正確的消息。如何在C#中的異常中獲取錯誤號而不是錯誤消息?

+0

這些COM錯誤或只是正常的CLR錯誤。 – 2013-03-17 15:43:56

+0

目前正常的CLR錯誤。 – Breeze 2013-03-17 15:44:39

+0

我已經看到了這個問題,ex.Hresult不適合我,(每次我嘗試它都是空的)。 – Breeze 2013-03-17 15:47:50

回答

8

如果你正在尋找的Win32錯誤代碼,這可在Win32Exception

catch (Win32Exception e) 
{ 
    Console.WriteLine("ErrorCode: {0}", e.ErrorCode); 
} 

對於普通的舊CLR例外,沒有整型錯誤碼。

鑑於你描述的問題,我會用millimoose的解決方案來獲取每種類型異常的資源字符串。

5

例外的要點是它們提供的信息比錯誤代碼更豐富。默認情況下,他們沒有一個,也不需要一個。如果你喜歡使用的錯誤代碼,你可以只使用您獲取的所有異常你自己的異常的基類:

public abstract class MyExceptionBase : Exception 
{ 
    public int ErrorCode { get; set; } 
    // ... 
} 

這麼說,我不會理會。我個人異常映射使用他們的類型名稱錯誤消息:

ResourceManager errorMessages = ...; 
errorMessages.GetString(ex.GetType().FullName); 

(你也可以創建更靈活的方案,比如使資源格式字符串和異常性插值到它們)

+0

+1這幾乎是我所做的。 – 2013-03-17 15:54:06

+0

無論操作系統的語言還是其他本地設置,「ex.GetType()。FullName」都會返回相同的文本(例如「System.Security.SecurityException」)嗎? – Rado 2016-08-09 05:57:19

+0

@Rado它是代碼中的類型名稱,'.GetType().FullName'是標準的.NET反射,而不是一個異常特定的API。我約99.999%肯定不可能本地化C#中的類型名稱。 – millimoose 2016-08-14 02:57:33

3

對於COM異常並且升級到一個託管異常,你就可以檢索來自HResult財產「錯誤代碼」這樣:

try { 
    // code goes here 
} catch(System.IO.FileNotFoundException ex) { 
    Console.WriteLine(
     String.Format("(HRESULT:0x{1:X8}) {0}", 
         ex.Message, 
         ex.HResult) 
    ); 
} 

不是所有的異常然而,將會有一個有意義的HResult集。


對於.NET 3.0,3.5和4.0,你將不得不使用反射,因爲它被標記爲protected得到HResult屬性的值。

+1

注意:這僅適用於.NET 4.5。 'HResult'在早期版本中受到保護。 – millimoose 2013-03-17 15:49:29

+0

所以這就解釋了爲什麼我總是在我的Hresult中變爲空!謝謝 – Breeze 2013-03-17 15:49:54

+0

@millimoose:你仍然可以通過其他方式獲得它(反射)。 – 2013-03-17 15:52:08

相關問題