[英]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();
}
}
但是,如果需要從try
和catch
兩個函數調用一個函數,那么最好從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);
}
}
我能想到一些解決方案:
使用abc()
的附加輸入,檢測方法調用的位置。 如果要在發生錯誤時更改方法abc的功能,請使用此方法。
使用日志。 打印日志,看到錯誤。 我推薦這種方法,因為你的方法簽名保持不變。
在類中添加一個靜態變量(如布爾值)並在發生錯誤時設置此變量並在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.