Я пишу парсер для 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();
}
Есть ли способ улучшить мой код? И делают ли этот тип печати / регистрации более программно?
ОБНОВЛЕНИЕ: Я пытался реализовать то, что Йоахим Зауэр ответил, но я не знаю, правильно ли я все понял или смог бы улучшить. Пожалуйста, дайте мне отзыв. Вот мой код:
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);
}
}
Класс Wrapper:
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: В исключении .net как получить трассировку стека со значениями аргументов