F#/Argu-如何在不引发异常的情况下显示两级命令树的帮助

F#/Argu-如何在不引发异常的情况下显示两级命令树的帮助,f#,command-line-arguments,F#,Command Line Arguments,我有一个两级F#/Argu命令树。其缩写版本如下所示: [<CliPrefix(CliPrefix.Dash)>] type RunContGenArgs = | [<Unique>] [<EqualsAssignment>] [<AltCommandLine("-ql")>] MaxQueueLength of int with interface IArgParserTemplate with member t

我有一个两级F#/Argu命令树。其缩写版本如下所示:

[<CliPrefix(CliPrefix.Dash)>]
type RunContGenArgs =
    | [<Unique>] [<EqualsAssignment>] [<AltCommandLine("-ql")>] MaxQueueLength of int

with
    interface IArgParserTemplate with
        member this.Usage =
            match this with
            | MaxQueueLength _ -> "max queue length."
and
    [<CliPrefix(CliPrefix.None)>]
    ContGenArguments =
        | [<Unique>] [<AltCommandLine("run")>]      RunContGen of ParseResults<RunContGenArgs>
    with
        interface IArgParserTemplate with
            member this.Usage =
                match this with
                | RunContGen _ -> "run Continuous Generation."
如果我将
let results=parser.Parse argv
更改为
let results=parser.Parse(argv,raiseOnUsage=false)
,则它不会崩溃,但不会显示任何帮助消息。然后,因为命令
run
可以在没有任何第二级参数的情况下运行,所以程序只是继续运行,而不是显示帮助和退出


但是,我需要
ContGen.exe运行帮助
只需显示帮助消息,然后退出。我怎样才能做到这一点?谢谢。

这是阿尔古有点奇怪的行为;您需要提供自己的exiter,以避免抛出异常

大致如下:

type NonThrowingExiter()=
接口IExiter与
member _u.Name=“Exiter”//我不知道这是用来做什么的;我从未见过它出现在任何地方
成员退出(消息,代码)=
如果code=ErrorCode.HelpText,则
printfn“%s”消息
出口0
其他的
printfn“%s”msg//此处可能有将控制台输出涂成红色的代码
出口1
要使用此选项,请按如下方式创建“ArgumentParser”:
让参数分析器=
Argu.ArgumentParser.Create(helpTextMessage=“Help requested”,
errorHandler=NonThrowingExiter())

(当然,您实际上不需要为此创建类;对象表达式也可以这样做。)

您能指出发布代码中的哪些行与错误消息中提到的行相对应吗?也可以将它们添加到文章中,并在每一行前面添加一些上下文行。@MarkusDeibel该行
let results=parser.Parse argv
将在我运行
ContGen.exe运行help
时崩溃,出现上述异常。异常中提到的行不是我的,因为它们来自Argu:(除了捕获异常之外,我无法控制它。谢谢!F#“way”似乎返回选项类型,而不是抛出异常。
[<EntryPoint>]
let main argv =
    let parser = ArgumentParser.Create<ContGenArguments>(programName = "ContGen.exe")
    let results = parser.Parse argv

    match results.GetAllResults() |> ContGenTask.tryCreate with
    | Some task -> task.run()
    | None ->
        printfn "%s" (parser.PrintUsage())
        -1
Unhandled Exception: Argu.ArguParseException: USAGE: ContGen.exe runcontgen [help] [-maxqueuelength=<int>]
OPTIONS:
    -maxqueuelength, -ql=<int>
                          max queue length.
    help                  display this list of options.
   at Argu.ExceptionExiter.Argu-IExiter-Exit[a](String msg, ErrorCode errorCode) in C:\Users\eirik.tsarpalis\devel\public\Argu\src\Argu\Types.fs:line 62
   at Argu.ArgumentParser\`1.Parse(FSharpOption\`1 inputs, FSharpOption\`1 configurationReader, FSharpOption\`1 ignoreMissing, FSharpOption\`1 ignoreUnrecognized, FSharpOption\`1 raiseOnUsage) in C:\Users\eirik.tsarpalis\devel\public\Argu\src\Argu\ArgumentParser.fs:line 180
   at Program.main(String[] argv) in C:\GitHub\ClmFSharp\Clm\ContGen\Program.fs:line 8