2012-08-17 106 views
7

我有一個要求,如果遇到特定的錯誤並返回一個對象的情況下引發異常。返回錯誤並拋出異常

所以我希望做這樣的事情:

if(error) 
return obj; 
throw new FaultException(string.Format("Error found with ID={0}", ID)) 

這不會明顯地工作,因爲回報會阻止異常被拋出。

任何人都可以建議什麼是達到此目的的最佳方式。我能以某種方式傳遞異常中的對象嗎?

謝謝

+4

爲什麼要在異常情況下返回一些對象? – 2012-08-17 09:02:34

+0

您能否顯示您正在實施的方法的簽名? – 2012-08-17 09:11:51

回答

8

通常情況下,你會創建自己的異常類,它將包含所有的數據。但我看到FaultException這意味着WCF,並且已經有FaultException<T>

6

在某些方法的上下文中,拋出異常和返回結果是互斥的東西。

所以,如果你想爲用戶提供附加信息的客戶端代碼,就可以實現自定義異常(從Exception類派生)與自定義屬性

[Serializable] 
public class MyException : Exception 
{ 
    public MyCustomObject CustomObject { get; private set; } 

    public MyException(MyCustomObject customObject) 
    { 
     CustomObject = customObject; 
    } 

    public MyException(string message, MyCustomObject customObject) 
     : base(message) 
    { 
     CustomObject = customObject; 
    } 

    public MyException(string message, Exception inner, MyCustomObject customObject) 
     : base(message, inner) 
    { 
     CustomObject = customObject; 
    } 

    protected MyException(
     SerializationInfo info, 
     StreamingContext context) 
     : base(info, context) 
    { 
     // TODO: Implement serializable stuff. 
    } 

    #region Overrides of Exception 

    public override void GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     // TODO: Implement serializable stuff. 
     base.GetObjectData(info, context); 
    } 

    #endregion 
} 

現在你可以扔了!

throw new MyException(obj); 
4

你是正確的,你不能都返回一個對象,並拋出一個異常。如果這是您的要求,我會建議嘗試修改它。

但我會說你在正確的軌道上,拿出一個包括返回對象的異常。捕捉異常並從中獲取「返回」值。

編輯:我發現一個非常有趣的討論,然後關於throwing exception vs returning error code。一探究竟。我仍然認爲你更喜歡和其他人一起去。

0

如果您想從擴展中獲取上下文,請將其放入Exception.Data或創建您自己的異常類並向其中添加成員(如果需要序列化異常,這樣做會更好)。

但是,如果您重構了代碼並且/或者重新考慮了需求,那麼它可能會更可取(但不能沒有上下文就說明),因此您根本不需要這樣做。

0

你可以一個例外屬性添加到任何類型obj是具有關聯異常返回obj(如果被拋出),然後檢查異常的調用代碼中存在此方法,或者無論你在哪裏返回obj即可。

有點雜亂,但可能適合您所描述的設置。