2013-08-01 72 views
4

我真的不知道在多語言應用程序中處理異常的最佳方法。如何處理異常信息的翻譯?

我應該在哪裏處理錯誤信息的翻譯(Exception.Message)?

只要我拋出異常,我應該在ctor中翻譯消息嗎?

throw new MyException("Error message", Resource.MyException_TranslatedMessage); 

還是我拋出異常,我使用的是自制的幫手會發現使用異常的類型在視圖的邏輯錯誤消息?

try 
{ 
    //... 
} 
catch(Exception ex) 
{ 
    myLabel.Text = new ExceptionTranslator(ex).Translate(); 
} 

或者,微軟是否提供了一個工具或機制來做到這一點?

總之:處理異常消息轉換的最佳實踐是什麼?

+0

提示:切勿使例外用戶:)更好地嘗試通過翻譯管理器翻譯自己的消息 – wudzik

回答

6

最例外的是有技術的目的,除非您的操作和維修人員也設在不同的國家,這些例外應該簡單地以編寫和維護應用程序的人的語言寫出消息。

.NET框架包含本地化的異常消息。對我來說,作爲一名開發人員來說,這非常煩人,因爲我的本地語言(荷蘭語)的異常消息並不意味着原來的英語異常消息。但是,微軟將這些框架異常消息本地化似乎是合理的,因爲它們的目標受衆可以位於任何地方。

但是,某些類型的例外顯式拋出以顯示給用戶。這些是你的ValidationExceptionBusinessLayerException。他們明確的合同將被顯示給用戶。當然,你應該本地化的異常消息,但不是它們轉換,它往往是更好的,更容易引發異常時,從本地化的資源拉動異常消息:

throw new ValidationException(Resources.InvalidUserName); 
+0

只是一個問題:當應用程序使用中文配置時,如何將其記錄到文件中(語言我根本聽不懂;))。 –

+0

向用戶顯示的異常(即ValidationException)不記錄。它們不是錯誤,但是您可以使用它們快速安全地脫離操作。通常應記錄技術例外。 – Steven

2

更好的只有當它需要顯示,恕我直言,需要翻譯。 這適用於任何 localisable字符串,不只是錯誤消息。

理想情況下,代碼的邏輯不應該關心消息的內容或語言,它只關心異常的類型。它只是(可能)需要用本地語言顯示的表示層。

1

外部代碼不應該翻譯郵件

throw new MyException("Error message", Resource.MyException_TranslatedMessage); 

這是在我心中最好的解決方案,