0

我正在使用 args4j 来解析给我的程序的参数。

这是我定义 2 个 Date 类型参数的代码。处理程序只解析给定的日期,如果日期格式错误,则抛出 CommandLineException。

@Option(name="-b", metaVar="<beginDate>", handler=DateOptionHandler.class, usage="...")
private Date beginDate;

@Option(name="-e", metaVar="<endDate>", handler=DateOptionHandler.class, usage="...")
private Date endDate;

如果它是引发异常的 beginDate 或 endDate,我需要能够返回不同的代码(int 值)。

目前,我的主要方法如下所示:

CmdLineParser parser = new CmdLineParser(this);
parser.setUsageWidth(120);

try {
    parser.parseArgument(args);
} catch (CmdLineException e) {
    /* Print usage if an error occurs during the parsing */
    System.err.println(e.getMessage());
    System.err.println("Usage : java LaunchProgram [options]");
    e.getParser().printUsage(System.err);

    /* What I need to do : */
    if(optionWhichThrewTheException.equals("-b") return 2;
    if(optionWhichThrewTheException.equals("-e") return 3;

    /* Other arguments */
    return -1;
}

但我不知道如何知道哪个参数引发了异常(我查看了 CmdLineException 方法,但什么也没找到)。

有没有办法获取无法解析的参数?

提前感谢您的帮助。

4

1 回答 1

1

我从未使用过 args4j,但查看它的文档,似乎异常是由选项处理程序引发的。因此,使用 BDateOptionHandler 和 EDateOptionHandler,它们会抛出包含所需信息的 CmdLineException 的自定义子类:

public class BDateOptionHandler extends DateOptionHandler {
    @Override
    public int parseArguments(Parameters params) throws CmdLineException {
        try {
            super.parseArguments(params);
        }
        catch (CmdLineException e) {
            throw new ErrorCodeCmdLineException(2);
        }
    }
}

public class EDateOptionHandler extends DateOptionHandler {
    @Override
    public int parseArguments(Parameters params) throws CmdLineException {
        try {
            super.parseArguments(params);
        }
        catch (CmdLineException e) {
            throw new ErrorCodeCmdLineException(3);
        }
    }
}

...
try {
    parser.parseArgument(args);
} 
catch (CmdLineException e) {
    ...
    if (e instanceof ErrorCodeCmdLineException) {
        return ((ErrorCodeCmdLineException) e).getErrorCode();
    }
}
于 2012-04-30T14:21:44.983 回答