在Java异常中打印所有变量?

时间:2017-03-02 18:26:19

标签: java exception

背景:

我经常在Apache Spark上为ETL作业编写java代码,通常在cloudera CDH集群上设置每个数据源。我处理的数据通常很脏。例如对于邮政编码,我以为我可以使用整数来表示它,但可能存在一些记录,如" 85281-281"我们无法将其解析为整数。因此抛出异常并且程序因一堆堆栈跟踪而停止。

以前我必须根据我的假设编写代码,在集群上运行它,失败并有大量的堆栈跟踪。包括抛出异常的行号。但找到根本原因真的很费时,特别是我没有特定的数据线。

所以我想到以下几点:

  1. 发生错误时代码不应停止。这很容易,使用Java的异常处理系统可以轻松实现这一点。

  2. 我想知道当前堆栈中导致错误的变量内容,以便找到输入的根本原因(输入中的特定行)。不只是抛出异常的行号。例如NullPointerException,我想知道原始输入数据,输入文件中的哪条特定行导致了这一点。

  3. 我们有e.printStackTrace()来显示堆栈跟踪中的所有函数调用。我们可以通过在当前堆栈顶部显示内容来做得更好吗?就像调试器一样吗?

    当然我会通过手工编码手动打印出所有变量。但我只是想知道调试器是否有一个特定的函数来显示这些变量。

1 个答案:

答案 0 :(得分:0)

例如,如果您有以下代码

final String line = ... // get next line
processLine(line);

您可以将其转换为

final String line = ... // get next line
try {
    processLine(line);
} catch (RuntimeException e) {
    System.out.println(String.format("Oh no, an exception! The line was '%s'", line);
    e.printStackTrace();

    // ... any recovery logic
}

您不仅可以捕获RuntimeException,还可以捕获其他异常。您也可以登录某个记录器而不是登录。