如何在Java中打印导致Exception的参数值?

时间:2010-03-15 14:59:12

标签: java logging exception-handling try-catch

我正在为csv文件编写解析器,有时我会得到NumberFormatException。是否有一种简单的方法来打印导致异常的参数值?

目前我有许多 try-catch块看起来像这样:

String ean;
String price;

try {
    builder.ean(Long.parseLong(ean));
} catch (NumberFormatException e) {
    System.out.println("EAN: " + ean);
    e.printStackTrace();
}

try {
    builder.price(new BigDecimal(price));
} catch (NumberFormatException e) {
    System.out.println("Price: " + price);
    e.printStackTrace();
}

我希望能够写出类似的内容:

try {
    builder.ean(Long.parseLong(ean));
} catch (NumberFormatException e) {
    e.printMethod();    // Long.parseLong()
    e.printArgument();  // should print the string ean "99013241.23"
    e.printStackTrace();
}

我有什么方法可以改善我的代码吗?以编程方式更多地进行这种打印/记录?

更新:我试图实施 Joachim Sauer 回答的问题,但我不知道我是否把一切都搞定了,或者我是否可以改进它。请给我一些反馈。这是我的代码:

public class TrackException extends NumberFormatException {
    private final String arg;
    private final String method;

    public TrackException (String arg, String method) {
        this.arg = arg;
        this.method = method;
    }

    public void printArg() {
        System.err.println("Argument: " + arg);
    }

    public void printMethod() {
        System.err.println("Method: " + method);
    }
}

包装类:

import java.math.BigDecimal;
public class TrackEx {
    public static Long parseLong(String arg) throws TrackException {
        try {
            return Long.parseLong(arg);
        } catch (NumberFormatException e) {
            throw new TrackException(arg, "Long.parseLong");
        }
    }

    public static BigDecimal createBigDecimal(String arg) throws TrackException {
        try {
            return new BigDecimal(arg);
        } catch (NumberFormatException e) {
            throw new TrackException(arg, "BigDecimal.<init>");
        }
    }
}

使用示例:

try {
    builder.ean(TrackEx.createBigDecimal(ean));
    builder.price(TrackEx.createBigDecimal(price));
} catch (TrackException e) {
    e.printArg();
    e.printMethod();
}

编辑:同样的问题,但对于.NET:In a .net Exception how to get a stacktrace with argument values

3 个答案:

答案 0 :(得分:9)

您可以轻松地实现有关自定义编写的异常的详细信息,但大多数现有异常不仅仅提供详细消息和导致异常。

例如,您可以将所有数字解析需求包装到捕获NumberFormatException的实用程序类中,然后抛出自定义异常(可能扩展NumberFormatException)。

通过例外传递一些附加信息的例子是SQLException  getErrorCode()getSQLState()方法。

答案 1 :(得分:3)

创建一个方法,例如private parse (String value, int type),它执行实际的解析工作,包括异常处理和日志记录。

 parse(ean, TYPE_LONG);
 parse(price, TYPE_BIG_DECIMAL);

TYPE_只是告诉方法应该如何解析值。

答案 2 :(得分:1)

与另一个建议类似,您可以将Long.parseLong(ean)提取到它自己的方法中(在类中私有或在另一个实用类的类中公开)。

这个新方法可以处理任何自定义逻辑,您可以单独测试它。耶!