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异常中如何获得带有参数值的堆栈跟踪
您可以轻松地实现有关自定义编写的异常的详细信息,但大多数现有异常不仅仅提供详细消息和导致异常.
例如,您可以将所有数字解析需求包装到一个实用程序类中,该实用程序类会捕获NumberFormatException并引发自定义异常(可能会扩展NumberFormatException).
通过异常携带一些附加信息的示例是SQLException具有a getErrorCode()和getSQLState()方法的示例.