2017-03-02 34 views
2

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

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

以前我有写基于我的假设的代码,在集群上运行它,失败,堆栈跟踪的一个巨大的一堆。包括引发异常的行号。但是找到根本原因非常耗时,特别是我并不是特定的数据行。

所以我觉得以下几点:当错误发生时

  1. 的代码应该不会停止。这很简单,使用Java的异常处理系统可以轻松实现这一点。

  2. 我想知道这会导致错误的当前堆栈内容的变量,这样我就可以找到输入的(具体线路输入)的根本原因。不只是引发异常的行号。例如NullPointerException,我想知道原始输入数据,输入文件中的哪一行导致了这种情况。

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

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

+0

的Java就不会知道你想* *,看看有什么信息的任何方式。 “打印变量”并不意味着什么。哪些变量?你如何让他们以印刷形式呈现?运行时不知道这些事情。对于任何可能失败的给定操作,您必须使用您定义的逻辑来处理潜在的故障。 – David

+0

您可以使用['jdb'(http://www.tutorialspoint.com/jdb/) – sudoman

+0

可能重复:http://stackoverflow.com/questions/8944362/dumping-state-of-variables-on-exception – msi

回答

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