2015-08-31 30 views
3

在底層使用Type.GetType(typeName)的公共API中,最正確的做法是什麼?在Type.GetType(..)== null上拋出什麼?

//inside a message deserializer of a framework... 
.... 

//1. throw TypeLoadException 
var type = Type.GetType(typeName,true); 


//2. or.. 
var type = Type.GetType(typeName,false); 
if (type == null) 
    throw new SomeMoreSpecificException("Could not find message type " + typeName +", deserialization failed"); 


//3. or 
Type type; 
try 
{ 
    type = Type.GetType(typeName,true); 
} 
catch(TypeLoadException x) 
{ 
    throw new SomeMoreSpecificException("some message",x); 
} 

在這種情況下,您認爲上述哪種方法對最終用戶最有幫助?

我在這裏傾向於後一種情況,因爲您同時獲得了真正的TypeLoadException和一些特定於此特定用途的附加信息。 或者我們應該考慮TypeLoadException本身對於最終用戶來說足夠了嗎?

想法?

[編輯]更多的情況下,看到 https://github.com/akkadotnet/akka.net/issues/1279

在Akka.NET我們可以做演員的 「遠程部署」。 如果接收到部署請求的遠程系統不知道應該部署的類型,我們需要以某種方式通知它。 只拋出TypeLoadException感覺有點便宜,因爲它沒有找到問題的遠程部署方案。

+1

如果未找到類型,GetType(typeName)將返回null。如果傳遞「false」,那麼重載也是如此。 –

+1

它很大程度上取決於*其中'typeName'來自哪裏。 「框架」說明嚴重傾向於YouAreScrewedCallSupportException。 –

回答

2

這裏沒有正確和錯誤的答案。在拋出的異常中,可以通過折中獲得更多細節,而不是拋出異常拋出(原始拋棄和自定義拋出拋棄)的開銷。

現在的問題是 - 你預計用戶做什麼與你拋出異常?您提供的「某條消息」是否比原始異常更詳細?或者,如果它獲得了特定的異常類型,它會讓用戶做一些不同的事情嗎?如果沒有,我只會讓原來的異常冒出來。

相關問題