如果遇到特定错误并且在这种情况下返回一个对象,我需要抛出异常。
所以我想做这样的事情:
if(error)
return obj;
throw new FaultException(string.Format("Error found with ID={0}", ID))
这显然不会起作用,因为return会阻止抛出异常。
任何人都可以建议最好的方法来实现这个目标。我可以以某种方式传递异常中的对象吗?
由于
答案 0 :(得分:9)
通常,您将创建自己的异常类,其中包含您的所有数据。但我看到FaultException
暗示了WCF,为此已经FaultException<T>
。
答案 1 :(得分: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);
答案 2 :(得分:4)
你是对的,你不能同时返回一个对象并抛出异常。如果这是您的要求,我建议您尝试修改它。
但我会说你走在正确的轨道上,想出一个包含return-object的异常。捕获异常并从中获取“返回”值。
编辑:我前段时间对throwing exception vs returning error code进行了一次非常有趣的讨论。看看这个。我仍然认为你最好选择其中一个。
答案 3 :(得分:0)
如果要从扩展中获取上下文,请将其放在Exception.Data
内或创建自己的异常类并向其添加成员(如果需要序列化异常,这将更好地工作)。
然而,如果您重构代码和/或重新考虑要求以便您根本不需要这样做,那么可能会更好(但不能在没有上下文的情况下说明)。
答案 4 :(得分:0)
您可以将异常属性添加到obj
类型的任何类型,并返回obj
以及相关的异常(如果抛出一个异常),然后检查是否存在异常在此方法的调用代码中,或者您将obj
返回到的任何位置。
稍微凌乱但可能适合您所描述的设置。