包装函数的返回值是一个好主意吗?

时间:2014-08-25 19:12:28

标签: c# .net function

将函数的返回值包装在类中是一个好主意。它提供了易于编码,你可以避免尝试...捕获 我正在做这样的事情。

public class ResultWrapper
{
    public bool Success{get;set;}
    public Exception ErrorMessage{get;set;}
    public object Result{get;set;} //not object essentially(any type) 

    public Result()
    {
            Success=false;
            ErrorMessage="";
            Result=null;
    }
}

public ResultWrapper DoSomething(parameters....)
{
    var result=new ResultWrapper()
    try
    {

    }
    catch(Exception ex)
    {
        result.Error=ex;
    }
    return result;

}

然后将其称为

static void main()
{
    var result=DoSomething(parameters...);
    if(result.Success)
    {
        //Carry on with result.Result;
    }
    else
    {
        //Log the exception or whatever... result.Error
    }
}

修改

考虑这个

static void main()
{
    var result=Login(); //throws an exception
    if(result.Success)
    {
        //retrive the result
        //carry on
        result=PostSomeStuff(parameter);
        if(result.Success)
        {

        }
        else
        {
            Console.WriteLine("Unable to Post the data.\r\nError: {0}",result.Error.Message);
        }
    }
    else
    {
        Console.WriteLine("Unable to login.\r\nError: {0}",result.Error.Message);
    }
}

在每个函数之外包装try..catch是不是更简单???

static void main()
{
    try
    {
        var result=Login();
        var result1=result=PostSomeStuff(parameter);
        // a lot of functions doing seprate things.

    }
    catch(Exception ex)
    {
        //what to do...?
    }

}

3 个答案:

答案 0 :(得分:5)

不,这是一种反模式。如果有任何例外,你不知道如何处理,那么让它传播。当语言支持异常时,返回返回值中的异常对象是一个非常糟糕的主意。

如果方法成功,它应该直接返回值;如果它失败了它应该抛出异常。 (警告:某些方法可能返回bool表示成功或失败,并将结果存储在out参数中。例如,int.TryParse()Dictionary<TKey, TValue>.TryGetValue()等。由于例外可以如果价格昂贵,某些操作可能更适合简单地返回一个标志,表明如果故障是经常发生故障,但这应该是罕见的。)

答案 1 :(得分:2)

一般没有。可能有特定情况,这是一个好主意,但我不建议将其作为默认值。

这将使得例外不可能“冒出来”#34;直到它到达一个处理它的好地方。它会使代码更难理解。

答案 2 :(得分:0)

这太糟糕了。想想将多少if语句添加到您的代码中,只是为了检查是否抛出了异常。

另外,想一想:如果这是一个好主意,那么.NET Framework本身就可以做到这一点。你有没有在.NET的任何地方看到这种模式?我没有。

你应该几乎总是匹配你正在使用的框架的语义,否则你最终会得到一个奇怪的混搭。很快你就会有10个竞争编码&#34;标准。&#34;