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

Jon*_*nas 4 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();
}
Run Code Online (Sandbox Code Playgroud)

我希望能够写出如下内容:

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

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

更新:我试图实施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);
    }
}
Run Code Online (Sandbox Code Playgroud)

包装类:

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>");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用示例:

try {
    builder.ean(TrackEx.createBigDecimal(ean));
    builder.price(TrackEx.createBigDecimal(price));
} catch (TrackException e) {
    e.printArg();
    e.printMethod();
}
Run Code Online (Sandbox Code Playgroud)

编辑:相同的问题,但对于.NET:在.net异常中如何获得带有参数值的堆栈跟踪

Joa*_*uer 9

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

例如,您可以将所有数字解析需求包装到一个实用程序类中,该实用程序类会捕获NumberFormatException并引发自定义异常(可能会扩展NumberFormatException).

通过异常携带一些附加信息的示例是SQLException具有a getErrorCode()getSQLState()方法的示例.