Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 包装函数的返回值是个好主意吗?_C#_.net_Function - Fatal编程技术网

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

C# 包装函数的返回值是个好主意吗?,c#,.net,function,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()

将函数的返回值封装在类中是一个好主意。它提供了简单的编码,您可以避免尝试…捕获 我正在考虑做这样的事情

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...?
    }

}

通常不会。在某些特定情况下,这可能是一个好主意,但我不建议将其作为默认设置


这将使得在异常到达一个好的处理位置之前,不可能允许异常“冒泡”。这会使代码更难理解。

通常不会。在某些特定情况下,这可能是个好主意,但我不建议将其作为默认设置


这将使得在异常到达一个好的处理位置之前,不可能允许异常“冒泡”。这将使代码更难理解。

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


如果方法成功,则应直接返回值;如果失败,它应该抛出一个异常。(注意:某些方法可能返回指示成功或失败的
bool
,并将结果存储在
out
参数中。例如,
int.TryParse()
Dictionary.TryGetValue()
,等等。由于异常可能代价高昂,如果预计故障会很频繁,某些操作可能更适合简单地返回一个指示故障的标志,但这种情况应该很少发生。)

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


如果方法成功,则应直接返回值;如果失败,它应该抛出一个异常。(注意:某些方法可能返回指示成功或失败的
bool
,并将结果存储在
out
参数中。例如,
int.TryParse()
Dictionary.TryGetValue()
,等等。由于异常可能代价高昂,如果故障预计会很频繁,某些操作可能更适合简单地返回一个指示故障的标志,但这应该是罕见的情况。)

这太可怕了。想想有多少if语句将被添加到您的代码中,只是为了检查是否引发了异常

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


您几乎应该始终匹配您正在使用的框架的语义,否则您将得到一个奇怪的mish mash。很快你就有了10个相互竞争的编码“标准”。

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

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


您几乎应该始终匹配您正在使用的框架的语义,否则您将得到一个奇怪的mish mash。很快你就有了10个相互竞争的编码“标准”。

我认为引入了例外来消除这种带有数百个错误代码的包装器。这是一个非常普遍的问题。这就像问你是否应该返回一个
字符串
int
——如果没有更多的上下文,我们无法真正回答……请不要遵循
ERROR\u SUCCESS
的模式。通常,由调用方确定哪些异常是问题。当用户试图包含丢失的文件时,文本编辑器可能会将未找到的文件视为显示警告消息框的原因。反应堆控制系统可能希望将丢失的文件视为更重要的文件。如果唯一可用的细节是“不成功”,那么用户体验、调试、可维护性。。。“所有人都在受苦。”琼斯基特检查edit@AbdullahSaleem因此,请检查:。这是我介绍异常的示例。我认为引入异常是为了消除这种带有数百个错误代码的包装器。这是一个非常普遍的问题。这就像问你是否应该返回一个
字符串
int
——如果没有更多的上下文,我们无法真正回答……请不要遵循
ERROR\u SUCCESS
的模式。通常,由调用方确定哪些异常是问题。当用户试图包含丢失的文件时,文本编辑器可能会将未找到的文件视为显示警告消息框的原因。反应堆控制系统可能希望将丢失的文件视为更重要的文件。如果唯一可用的细节是“不成功”,那么用户体验、调试、可维护性。。。“所有人都在受苦。”琼斯基特检查edit@AbdullahSaleem因此,请检查:。这是我介绍异常的示例。虽然我想说的是一般情况,但我认为对于某些操作,
TryXyz
模式非常有效,特别是在解析方面。看过你的编辑-我认为能够获得更多关于解析失败的细节是很有用的。。。因此野田佳彦的封装
ParseResult
。他们推迟抛出异常,但您仍然可以在需要时这样做。)只需编辑帖子。我的观点是,扭曲它们可以准确地告诉您是哪个函数引发了异常,因此您可以相应地管理它,从而省去了在函数中捕获和引发异常的麻烦function@AbdullahSaleem通过查看堆栈跟踪对象,可以准确确定引发异常的函数。但通常这对试图调试代码的人没有帮助。你能展示一个真实的案例吗