控制 fmt.Parse 在解析错误时的输出

huangapple go评论78阅读模式
英文:

Control fmt.Parse output on Parsing Error

问题

var timesFlag int
flag.IntVar(&timesFlag, "times", 1, "打印次数")
flag.Parse()

如果我运行程序并输入 prog -times=abc(<--- 不是整数)

fmt.Parse 会在控制台上输出这个丑陋的错误信息:

对于标志 -times,值“-abc”无效:strconv.ParseInt:解析“-abc”时出现无效语法

显然,我无法阻止用户在命令行中输入任何内容。这个错误对用户来说看起来很糟糕,需要更友好的提示。我该如何将这个错误信息静默处理,不让它输出到 stderr/stdout,并检测到有错误发生?

英文:
var timesFlag int  
flag.IntVar(&amp;timesFlag, &quot;times&quot;, 1, &quot;Number of times to print&quot;)
flag.Parse()

If I run the program and type in prog -times=abc (<--- not an int)

fmt.Parse spits out this ugly error message on the console:

invalid value "-abc" for flag -times: strconv.ParseInt: parsing "-abc": invalid syntax

Obviously, I can't prevent the user from typing in anything from the command line. The error looks like garbage to the user and needs to look more friendlier. How do I silent this error from going to stderr/stdout and detect there was an error generated?

答案1

得分: 1

flag.CommandLine 是一个类型为 FlagSet 的变量,用于处理命令行参数,如果你使用 flag 包中的函数而不是 FlagSet 类型的方法。

你可以使用 FlagSet.SetOutput() 方法设置输出(一个 io.Writer),用于打印错误消息。你可以设置一个 bytes.Buffer,这样消息只会被写入缓冲区而不会显示在控制台上。注意,不要将 nil 设置为输出目标,因为这意味着将消息打印到标准输出(控制台)。

然后自己调用 FlagSet.Parse(),并将 os.Args[1:] 作为要解析的参数传递进去。FlagSet.Parse() 返回一个 error,你可以自行处理该错误。

英文:

The flag.CommandLine variable of type the FlagSet is used to handle command line arguments if you use the functions of the flag package which are not methods of the FlagSet type.

You can set the output (an io.Writer) where error messages are printed with the FlagSet.SetOutput() method. You can set a bytes.Buffer so messages will only end up in a buffer (and not on your console). Note that do not set nil as that means to print to the standard output (console).

And call FlagSet.Parse() yourself where you can pass os.Args[1:] as the arguments to be parsed. FlagSet.Parse() returns an error which you can handle yourself.

huangapple
  • 本文由 发表于 2015年2月9日 08:32:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/28401111.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定