F #: Получение исключения для аргумента --help при использовании Argu - PullRequest
0 голосов
/ 26 января 2019

Я очень плохо знаком с F # и пытаюсь создать консольное приложение, которое принимает параметры. Я нашел библиотеку Argu и пытался заставить работать простой пример. Следующее работает как исключение, если передано --commanda или --commandb аргументы, но я получаю исключение, если я пытаюсь --help.

open System
open Argu

type CliArguments =
    | CommandA
    | CommandB
with 
    interface IArgParserTemplate with
        member s.Usage = 
            match s with 
            | CommandA -> "CommandA - Do something" 
            | CommandB -> "CommandB - Do something"

[<EntryPoint>]
let main argv = 

    let parser = ArgumentParser.Create<CliArguments>()
    let results = parser.Parse argv

    results.GetAllResults()
    |> List.iter (fun x ->
                    match x with
                    | CommandA -> printfn "CommandA"
                    | CommandB -> printfn "CommandB")

    0

Исключение составляет:

> .\Argu_sample.exe --help

Unhandled Exception: Argu.ArguParseException: USAGE: Argu_sample.exe [--help] [--commanda] [--commandb]

OPTIONS:

    --commanda            CommandA - Do something
    --commandb            CommandB - Do something
    --help                display this list of options.

   at Argu.ExceptionExiter.Argu-IExiter-Exit[a](String msg, ErrorCode errorCode)
   at Argu.ArgumentParser`1.Parse(FSharpOption`1 inputs, FSharpOption`1 configurationReader, FSharpOption`1 ignoreMissing, FSharpOption`1 ignoreUnrecognized, FSharpOption`1 raiseOnUsage)
   at Program.main(String[] argv) in C:\Data\FSharp\Argu-sample\Argu-sample\Program.fs:line 18

Что я делаю не так?

Спасибо.

ОБНОВЛЕННЫЙ КОД С РЕШЕНИЕМ:

Основываясь на комментариях AMieres, я использовал try with:

open System
open Argu

type CliArguments =
    | CommandA
    | CommandB
with 
    interface IArgParserTemplate with
        member s.Usage = 
            match s with 
            | CommandA -> "CommandA - Do something" 
            | CommandB -> "CommandB - Do something"

[<EntryPoint>]
let main argv = 

    let parser = ArgumentParser.Create<CliArguments>()

    try 
        let results = parser.Parse argv

        results.GetAllResults()
        |> List.iter (fun x ->
                        match x with
                        | CommandA -> printfn "CommandA"
                        | CommandB -> printfn "CommandB") 
        0
    with
    | :? ArguParseException as ex ->
        printfn "%s" ex.Message
        1
    | ex ->
        printfn "Internal Error:"
        printfn "%s" ex.Message
        2

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Вам необходимо предоставить обработчик ошибок:

let errorHandler = ProcessExiter(colorizer = function ErrorCode.HelpText -> None | _ -> Some ConsoleColor.Red)
let parser = ArgumentParser.Create<CliArguments>(errorHandler = errorHandler)
0 голосов
/ 26 января 2019

Я, кажется, недокументированная особенность.--help рассматривается как исключение, и вам нужно либо обработать его с помощью try with, либо предоставить обработчик.

Проверьте пример в Github: https://github.com/fsprojects/Argu/blob/master/samples/Argu.Samples.LS/Program.fs.

В нем:анализатор создан с обработчиком ошибок:

let errorHandler = ProcessExiter(colorizer = function ErrorCode.HelpText -> None | _ -> Some ConsoleColor.Red)
let parser = ArgumentParser.Create<LsArguments>(programName = "ls", errorHandler = errorHandler)

В случае сомнений обратитесь к коду: https://github.com/fsprojects/Argu/blob/b1569917af314dfd3b77fb79fec2a157a51324c7/src/Argu/Types.fs#L29

/// Error codes reported by Argu
type ErrorCode =
    | HelpText = 0
    | AppSettings = 1
    | CommandLine = 2
    | PostProcess = 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...