2016-07-02 50 views
0

我需要跟蹤點,直到代碼運行。考慮到程序如下:跟蹤點,直到代碼運行

function f() throws Exception{ 
    statement 1 //can throw exception 
    statement 2 //can throw exception 
    statement 3 //can throw exception 
} 

我需要一個機制來識別在發生點什麼異常,一個方法是參考爲此使用的例外,即創造了例外本身就是一個變量,或通過一些運作f並用它來確定成功運行的功能在哪個點上。

哪種方法更好,還是有更好的方法來做到這一點?

+0

你拋出這些異常或API,你正在使用? – Andrew

+0

我拋出一些上層的異常,在那個層次上,如果代碼在某個時刻運行,我需要找出一種方法,以便我可以採取特定的操作。 –

+0

你有沒有'f'的手?你可以改變它嗎?如果是這樣,每個語句周圍的一些「嘗試捕獲」可以幫助您打包自定義拋出的異常,並稍後處理自定義拋出的異常。某些方面可能是另一種解決方案 –

回答

5

一個常見的錯誤是不打印出堆棧跟蹤,或根本不打印出異常。不要在大多數情況下這樣做,因爲你扔掉了有用的信息。

我會使用調試器來遍歷代碼或找到引發異常的確切點,或者您可以讀取異常的堆棧跟蹤。

public static void f() throws Exception { 
    statement1(); //can throw exception line 101 
    statement2(); //can throw exception line 102 
    statement3(); //can throw exception line 103 
} 

當堆棧跟蹤顯示它在第101,102或103行上拋出異常時,它會告訴您它正在執行哪條語句。

如果您需要在運行時執行此操作,則每次將其中的每一個都放入try/catch塊時執行一些不同的操作。

public static void f() throws Exception { 
    try { 
     statement1(); 
    } catch (TheException e) { 
     doSomething1(); 
     // return or throw 
    } 
    try { 
     statement2(); 
    } catch (TheException e) { 
     doSomething2(); 
     // return or throw 
    } 
    try { 
     statement3(); 
    } catch (TheException e) { 
     doSomething3(); 
     // return or throw 
    } 
} 
+0

我在運行時需要它,我猜這個解決方案不會工作。 –

+3

@AkashdeepSaluja也可以在運行時讀取堆棧跟蹤,但是您需要知道行號的含義。一個更好的方法是在期望不同的行爲時使用不同的異常,或者將每個語句放在它自己的try/catch塊中。 –

+0

@AkashdeepSaluja我添加了一個使用多個try/catch塊的例子。 –

2

我想做一個小動作,但我不確定它是否正確。

public class ExceptionLevel extends Throwable { 
    private int value; 

    public ExceptionLevel (int v) { value = v; } 
} 

然後,當你拋出一個異常(它需要有一個Throwable(Throwable cause)構造函數),你應該

} catch (Exception e) { 
    e.initCause(new ExceptionLevel(1)); // from the first statement 
    throw new AnyException("message", e); 
} 

爲了處理這一切(內全球catch塊)

int statement = e.getCause() == null ? 0 : ((ExceptionLevel)e.getCause()).getValue(); 

我想你明白我的主要想法。您可以通過在chain of exceptions中將ExceptionLevel作爲最後一個原因稍微改進一點。

+0

這可能是一個解決方案,但原來的異常會丟失,這很糟糕 –

+1

我會爲不同的行爲使用不同的異常,或者如果我不想要大量的Exception類,請使用文本「消息」。 –

+0

@RC。,我們可以建立一連串的原因,沒有什麼可以鬆動的 – Andrew