2012-08-17 107 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即可。

有点杂乱,但可能适合您所描述的设置。