我有一個要求,如果遇到特定的錯誤並返回一個對象的情況下引發異常。返回錯誤並拋出異常
所以我希望做這樣的事情:
if(error)
return obj;
throw new FaultException(string.Format("Error found with ID={0}", ID))
這不會明顯地工作,因爲回報會阻止異常被拋出。
任何人都可以建議什麼是達到此目的的最佳方式。我能以某種方式傳遞異常中的對象嗎?
謝謝
我有一個要求,如果遇到特定的錯誤並返回一個對象的情況下引發異常。返回錯誤並拋出異常
所以我希望做這樣的事情:
if(error)
return obj;
throw new FaultException(string.Format("Error found with ID={0}", ID))
這不會明顯地工作,因爲回報會阻止異常被拋出。
任何人都可以建議什麼是達到此目的的最佳方式。我能以某種方式傳遞異常中的對象嗎?
謝謝
通常情況下,你會創建自己的異常類,它將包含所有的數據。但我看到FaultException
這意味着WCF,並且已經有FaultException<T>
。
在某些方法的上下文中,拋出異常和返回結果是互斥的東西。
所以,如果你想爲用戶提供附加信息的客戶端代碼,就可以實現自定義異常(從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);
你是正確的,你不能都返回一個對象,並拋出一個異常。如果這是您的要求,我會建議嘗試修改它。
但我會說你在正確的軌道上,拿出一個包括返回對象的異常。捕捉異常並從中獲取「返回」值。
編輯:我發現一個非常有趣的討論,然後關於throwing exception vs returning error code。一探究竟。我仍然認爲你更喜歡和其他人一起去。
如果您想從擴展中獲取上下文,請將其放入Exception.Data
或創建您自己的異常類並向其中添加成員(如果需要序列化異常,這樣做會更好)。
但是,如果您重構了代碼並且/或者重新考慮了需求,那麼它可能會更可取(但不能沒有上下文就說明),因此您根本不需要這樣做。
你可以一個例外屬性添加到任何類型obj
是具有關聯異常返回obj
(如果被拋出),然後檢查異常的調用代碼中存在此方法,或者無論你在哪裏返回obj
即可。
有點雜亂,但可能適合您所描述的設置。
爲什麼要在異常情況下返回一些對象? – 2012-08-17 09:02:34
您能否顯示您正在實施的方法的簽名? – 2012-08-17 09:11:51