【问题标题】:How can I print the argument value that caused Exception in Java?如何在 Java 中打印导致异常的参数值?
【发布时间】:2011-01-27 17:29:57
【问题描述】:

我正在为 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

【问题讨论】:

  • 关于您的解决方案:基本上就是这样,但我会改变两件事:1.) 提供原因(通过在构造函数中调用 initCause(),因为 NumberFormatException 没有构造函数)和 2.)用适当的 getter 替换 printArg()printMethod() 方法,因为打印到 System.err 可能不是开发人员想要对这些值执行的操作。
  • @Joachim Sauer:非常感谢,这是个好建议!

标签: java logging exception-handling try-catch


【解决方案1】:

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

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

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

【讨论】:

  • 我不知道我是否完全理解你,但我在问题中添加了我的实现。如果我错了,请给我评论。无论如何,它工作正常。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    这种新方法可以处理任何自定义逻辑,并且您可以单独对其进行测试。耶!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 2012-01-18
      • 2016-11-09
      • 1970-01-01
      • 2010-12-01
      • 2020-10-18
      相关资源
      最近更新 更多