我正在为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
答案 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)
提取到它自己的方法中(在类中私有或在另一个实用类的类中公开)。
这个新方法可以处理任何自定义逻辑,您可以单独测试它。耶!