2017-03-02 37 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的,但其他異常也是如此。您也可以登錄到某個記錄器而不是控制檯。