【问题标题】:Print all variables in Java exception? [duplicate]打印Java异常中的所有变量? [复制]
【发布时间】:2017-03-02 18:26:19
【问题描述】:

背景:

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

以前我必须根据我的假设编写代码,在集群上运行它,但由于大量堆栈跟踪而失败。包括引发异常的行号。但是找到根本原因确实很耗时,尤其是我没有具体的数据行。

所以我认为如下:

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

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

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

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

【问题讨论】:

  • Java 无法知道您想要查看哪些信息。 “打印变量”实际上没有任何意义。哪些变量?您希望它们如何以印刷形式呈现?运行时不知道这些事情。对于任何可能失败的给定操作,您必须使用您定义的逻辑来处理该潜在故障。
  • 你可以使用jdb

标签: java exception


【解决方案1】:

例如,如果你有以下代码

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,还可以捕获其他异常。您也可以登录到某个记录器而不是控制台。

【讨论】:

    猜你喜欢
    • 2013-10-31
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    相关资源
    最近更新 更多