簡體   English   中英

如何找出,如果在java中從catch塊調用相同的方法?

[英]How to find out , if same method is getting called from catch block or not in java?

我有一個方法,例如void abc(){} ,這個方法直接從我的main()方法調用,也從它的異常塊調用,也就是來自catch塊。

現在我想找出abc()方法內部,是否正常調用abc() (即從main() )或在異常情況下調用它(即從catch()塊調用)。

我嘗試使用Thread.getCurrentStackTrace() ,但它總是返回main()方法(作為方法名稱),因為在兩種情況下方法將始終保持相同。

這里重點是,我無法更改abc()方法的簽名,我無法在main()方法或catch()塊中設置任何標志,有了這個限制,我試圖找出,如何從哪里查看abc()被調用或簡單的話....如何在abc()方法中找出是否拋出異常。

請指教!

使用StackTraceElement ,您可以獲得行號,從中可以確定是否從main() catch塊調用abc() 看到這里 它類似於你已經嘗試過的東西,但你得到了行號

注意:僅當您擁有main方法的源代碼才能查看行號時,此選項才有效。 如果main在外部jar中,你的源代碼不可用,則無效。

編輯:此外,如果創建沒有行號調試信息的外部jar,這將不起作用。

Thread.getCurrentStackTrace()顯然不起作用,因為無論你是從main調用它還是從catch調用它都會保持相同。

比起什么選項,首先你可以做@Eran建議的內容而我不重復那個答案,如果你不想改變方法簽名,你可以做的另一件事就是在調用abc之前設置/取消設置一個布爾變量()來自catch block ..見下面的例子

private static boolean isCalledFromCatch = false;
public static void method ()
{
    if(isCalledFromCatch){
        //Catch specific processing here
    }else{
        //main specific processing here
    }
}

public static void main (String[] args)
{
    try {
      isCalledFromCatch = false;
        abc();
    }
    catch (Exception exc) {
        isCalledFromCatch = true;
        abc();
    }
}

但是,如果需要從trycatch兩個函數調用一個函數,那么最好從finally塊調用它。 這樣你就不需要從兩個不同的地方調用它。

您可以將boolean參數傳遞給您的方法,以便讓它知道調用它的位置。

public static void abc(boolean isError)
{
    if (isError) {
        // method was called from catch block
    }
}

public static void main (String[] args)
{
    try {
        ...
        abc(false);
        ...
    }
    catch (Exception exc) {
        abc(true);
    }
}

我能想到一些解決方案:

  1. 使用abc()的附加輸入,檢測方法調用的位置。 如果要在發生錯誤時更改方法abc的功能,請使用此方法。

  2. 使用日志。 打印日志,看到錯誤。 我推薦這種方法,因為你的方法簽名保持不變。

  3. 在類中添加一個靜態變量(如布爾值)並在發生錯誤時設置此變量並在abc檢查此變量。

您可以在方法中添加String參數:

public static void method (String msg)
{

}

public static void someOtherMethod(){
    method("calling from someOtherMethod");
}

public static void main (String[] args)
{
    try {
        method("calling from main");
    }
    catch (Exception exc) {
        method("an exception is thrown" );
    }

   someOtherMethod(){
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM