【问题标题】:How to do proper exception handling and return codes for Console Application如何为控制台应用程序进行正确的异常处理和返回代码
【发布时间】:2013-08-14 14:43:58
【问题描述】:

我有一个与 Web 服务对话的简单 C# 控制台应用程序。我不确定我处理期望和返回错误代码的方式是否正确。希望有良好实践的 cmets 来执行此操作。 (我使用 CommandLine.dll 进行选项解析)

class Program
    {
        static int Main(string[] args) {
            var options = new Options();
            if (CommandLine.Parser.Default.ParseArguments(args, options)) {
                try {
                    var client = new MyWebService();
                    var response = client.MyFunction(new MyRequest() { Param1 = options.param1, Param2 = options.Param2 });
                    if (response.ErrorCode != 0) {
                        Console.WriteLine("Error code= " + response.ErrorCode);
                    }
                    else {
                        File.WriteAllText(options.OutputFile, response.File);
                        return 0;
                    }
                }
                catch (Exception exp) {
                    Console.WriteLine(exp.Message);
                    return 1;
                }
            }
            return 1;
        }
    }

【问题讨论】:

    标签: c# exception-handling console-application


    【解决方案1】:

    您应该使用Console.Error.* 来写入错误。我会这样说:

    if (response.ErrorCode != 0) {
        Console.Error.WriteLine("Error code= " + response.ErrorCode);
        return 1;
    } else {
        File.WriteAllText(options.OutputFile, response.File);
    }
    

    加上一个结尾

    return 0;
    

    catch之后会更好,这样如果你有多阶段操作要做,编码会更容易(fall-through == ok, error == fast abort)

    我的意思是多阶段:

    call ws1
    check for non-Exception errors of ws1, if errors abort
    call ws2
    check for non-Exception errors of ws2, if errors abort
    call ws3
    check for non-Exception errors of ws3, if errors abort
    return success
    

    在cmd提示符下,保存错误:

    myprogram 2>err.txt
    

    重定向输出+错误:

    myprogram > err.txt 2>&1
    

    (最后一张取自https://stackoverflow.com/a/1420981/613130

    最后一件事:如果参数解析出错,你应该输出一个错误。

    【讨论】:

    • 谢谢!那真的很有用。我会改变我的程序。
    • @darthvader 通常信息/结果/帮助转到标准输出,错误到标准错误和警告在任何你想要的地方(但请参阅stackoverflow.com/q/1430956/613130
    【解决方案2】:

    您应该重构MyWebService 类和MyFunction,以便在发生错误时抛出异常。而不是返回错误代码。这为您提供了充分的灵活性,让您可以在哪个级别处理错误方面具有充分的灵活性,并且使代码更具可读性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 2016-04-08
      • 2011-03-09
      相关资源
      最近更新 更多