【问题标题】:How to catch that there is an error from CommandLineParser so I can return my own error codes?如何从 CommandLineParser 中捕捉到错误,以便我可以返回自己的错误代码?
【发布时间】:2022-01-23 06:56:19
【问题描述】:

如何从 CommandLineParser 中发现错误,以便我可以返回自己的错误代码? 当从 SSIS 调用我的控制台应用程序时,我需要返回我自己的代码。

class Program
{
    static void Main(string[] args)
    {
        try
        {
            var myParserResult = Parser.Default.ParseArguments<UploadFileCommand, DownloadFileCommand, CompressFileCommand>(args)
                .WithParsed<ICommand>(t => t.Execute());

            var parsed = myParserResult as NotParsed<object>;

         
             if (parsed != null && parsed.Errors.Any())
             {
                Console.WriteLine("Has Errors");
             }

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        
    }

}

【问题讨论】:

  • 请通过tour 了解 Stack Overflow 的工作原理,并阅读How to Ask 了解如何提高问题的质量。然后edit你的问题包括你的源代码作为工作minimal reproducible example,它可以被其他人编译和测试。请显示您尝试过的尝试以及您从尝试中得到的问题/错误消息。
  • 您的意思是在无法解析参数时返回您自己的错误代码?
  • @EricJ。是的,我想在解析参数出错时返回我自己的错误代码。
  • @OutOFTouch 您到底在说什么错误? ParseArguments() 方法将返回一个 ParserResult 您可以检查。
  • @Progman 如何从 PaserResult 中获取错误?

标签: c# command-line-parser


【解决方案1】:

ParseArguments() 方法将返回一个ParserResult&lt;T&gt; 对象来指示解析是否成功。如果解析不成功,则返回 NotParsed&lt;T&gt; 实例。这个类有一个Errors 属性来包含解析失败的所有Error 实例。您可以在正常的foreach() 循环中使用它来迭代发现的错误:

ParserResult<Options> result = parser.ParseArguments<Options>(args);
Console.WriteLine(result);
NotParsed<Options> notParsed = result as NotParsed<Options>;
if (notParsed != null)
{
    foreach (var error in notParsed.Errors)
    {
        Console.WriteLine(error);
    }
}

这可能会打印以下调试输出:

CommandLine.NotParsed`1[Testing.Options]
CommandLine.UnknownOptionError
CommandLine.UnknownOptionError

【讨论】:

  • 我根据您给出的答案更新了我的问题中的代码。我有什么工作或有更好的方法吗?我无法按原样使用您的代码,因为我没有定义 Options 类,我使用 ICommand 并在实现 ICommand 的命令类中定义选项
  • 我仍然不知道为什么我无法捕获 ArgumentNullException,无论我没有传递任何动词、传递不存在的动词还是传递选项,我从来没有看到过这个异常。
  • @OutOFTouch Options 类在我的代码中只是一个测试类,你必须使用自己的选项类(很可能是UploadFileCommandDownloadFileCommandCompressFileCommand)。跨度>
  • @OutOFTouch 没有可捕获的ArgumentNullException。如果您从某处获得ArgumentNullException,则必须编辑您的问题以包含minimal reproducible example,这会生成您想要捕获的ArgumentNullException
猜你喜欢
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 2011-03-11
  • 2011-06-12
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多