2013-12-16 101 views
-2
try 
{ 
    try 
    { 
     function(a, b); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     throw e; 
    } 
} 
catch (Exception e) 
{ 
    System.out.println("---------------------------------"); 
} 

我做這個嵌套的try-catch塊是有原因的,這很簡單,當我嘗試這個在Java try-catch中有沒有更簡單的方法來實現這一點?

try 
{ 
    function(a, b); 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
    System.out.println("---------------------------------"); 
} 

我打印線進來的堆棧跟蹤大部分時間的中間..

我的問題是爲什麼這會發生在大多數時間?有沒有更清晰的方法來避免這個問題?

+3

問題是什麼錯誤流? :O型。您的第一部分顯示冗餘。 –

+2

*我打印的這行大多數時間都在堆棧跟蹤的中間。*這是行I – SpringLearner

+0

此代碼使用EJB框架在Java Enterprise Environment上運行,第二個代碼在跟蹤堆棧內打印行最時間,就像那個'e。printStackTrace()'和'System.out..'不會順序執行 –

回答

4

問題是堆棧跟蹤寫入標準錯誤流,而您的行被寫入標準輸出流。通過

e.printStackTrace(); 
System.err.println("---------------------------------"); 

e.printStackTrace(System.out); 
System.out.println("---------------------------------"); 

在企業應用程序比客戶端應用程序更加更換它,你不應該打印到標準流反正。使用真正的日誌框架SLF4J一樣,這將讓你選擇的日誌記錄,目的地水平等

1

由於Throwable.printStackTrace()System.out.println(Object)寫入不同的控制檯(stderrstdout),他們可能無法同步。

第一項議案:寫錯誤給stdout

e.printStackTrace(System.out); 

或第二個建議:明確刷新stderr緩衝區(和你的第二個變體使用等):

e.printStackTrace(); 
System.err.flush(); 
System.out.println(...); 
1

它看起來就像打印堆棧跟蹤之間出現「--------」一樣,因爲在System.err上打印了異常,而在System.out上打印了「------」,但都打印到控制檯。

所以會發生這種情況:

  1. e.printStackTrace()打印一切System.err,但並不是所有的是立刻刷新到控制檯。
  2. System.out.println("--------------")將「----」打印到System.out並立即刷新它。
  3. System.err的其餘部分被刷新,現在如果你想System.errSystem.out出現在控制檯序列

沖洗使用System.out之前的錯誤流。

e.printStackTrace(); 
System.err.flush(); 
System.out.println("---------------------------------"); 

,或者使用兩個

e.printStackTrace(); 
System.err.println("---------------------------------"); 
相關問題