返回错误并抛出异常

时间:2012-08-17 09:01:43

标签: c# exception

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

所以我想做这样的事情:

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

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

任何人都可以建议最好的方法来实现这个目标。我可以以某种方式传递异常中的对象吗?

由于

5 个答案:

答案 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返回到的任何位置。

稍微凌乱但可能适合您所描述的设置。