我有一个要求,如果遇到特定的错误并返回一个对象的情况下引发异常。返回错误并抛出异常
所以我希望做这样的事情:
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