7

如果遇到特定错误并在这种情况下返回对象,我需要抛出异常。

所以我想做这样的事情:

if(error)
return obj;
throw new FaultException(string.Format("Error found with ID={0}", ID))

这显然不起作用,因为 return 会阻止抛出异常。

谁能建议实现这一目标的最佳方法。我可以以某种方式在异常中传递对象吗?

谢谢

4

5 回答 5

9

通常,您会创建自己的异常类,其中包含您的所有数据。但我看到FaultException这意味着 WCF,并且已经有FaultException<T>.

于 2012-08-17T09:03:32.770 回答
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);
于 2012-08-17T09:03:15.123 回答
4

你是正确的,你不能既返回一个对象又抛出一个异常。如果这是您的要求,我建议您尝试修改它。

但我会说你走在正确的轨道上,提出一个包含返回对象的例外。捕获异常并从中获取“返回”值。

编辑:不久前我发现了一个关于throwing exception 与 return error code的非常有趣的讨论。看看这个。我仍然认为您最好选择其中一个。

于 2012-08-17T09:03:26.203 回答
0

如果你想从扩展中获取上下文,把它放在里面Exception.Data或者创建你自己的异常类并添加一个成员(如果需要序列化异常,这会更好)。

但是,如果您重构代码和/或重新考虑要求以便您根本不需要这样做,它可能会更好(但不能在没有上下文的情况下判断)。

于 2012-08-17T09:05:31.393 回答
0

您可以将异常属性添加到任何类型obj并返回obj关联的异常(如果抛出异常),然后检查此方法的调用代码中是否存在异常,或者您要返回的任何位置obj

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

于 2012-08-17T09:06:57.203 回答