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

打印Java异常中的所有变量?,java,exception,Java,Exception,背景: 我经常在ApacheSpark上为ETL任务编写java代码,通常在ClouderaCDH集群上,每个数据源都已设置。我正在处理的数据通常是脏的。例如,对于邮政编码,我想我可以使用一个整数来表示它,但可能存在一些记录,如“85281-281”,我们无法将其解析为整数。因此,会抛出一个异常,程序会停止,并出现一系列堆栈跟踪 以前,我必须根据我的假设编写代码,在集群上运行,失败时有大量堆栈跟踪。包括引发异常的行号。但找到根本原因确实很耗时,特别是我不知道具体的数据行 因此,我认为: 发生错误

背景:

我经常在ApacheSpark上为ETL任务编写java代码,通常在ClouderaCDH集群上,每个数据源都已设置。我正在处理的数据通常是脏的。例如,对于邮政编码,我想我可以使用一个整数来表示它,但可能存在一些记录,如“85281-281”,我们无法将其解析为整数。因此,会抛出一个异常,程序会停止,并出现一系列堆栈跟踪

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

因此,我认为:

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

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

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


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

    例如,如果您有以下代码

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

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