如果遇到特定错误并在这种情况下返回对象,我需要抛出异常。
所以我想做这样的事情:
if(error)
return obj;
throw new FaultException(string.Format("Error found with ID={0}", ID))
这显然不起作用,因为 return 会阻止抛出异常。
谁能建议实现这一目标的最佳方法。我可以以某种方式在异常中传递对象吗?
谢谢
通常,您会创建自己的异常类,其中包含您的所有数据。但我看到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 与 return error code的非常有趣的讨论。看看这个。我仍然认为您最好选择其中一个。
如果你想从扩展中获取上下文,把它放在里面Exception.Data
或者创建你自己的异常类并添加一个成员(如果需要序列化异常,这会更好)。
但是,如果您重构代码和/或重新考虑要求以便您根本不需要这样做,它可能会更好(但不能在没有上下文的情况下判断)。
您可以将异常属性添加到任何类型obj
并返回obj
关联的异常(如果抛出异常),然后检查此方法的调用代码中是否存在异常,或者您要返回的任何位置obj
。
有点凌乱,但可能适合您描述的设置。