簡體   English   中英

在java中嘗試捕獲語法糖

[英]try-catch syntactic sugar in java

我想知道在java(純代碼,而不是一些Eclipse的東西)中是否有一種方法可以將“語法糖”重復嘗試捕獲代碼。 也就是說,我必須包裝一堆函數

public void foo(){
  try{
        // bla
  } catch (Exception e) {
            System.out.println("caught exception:");
            e.printStackTrace();
  }
}

public void bar(){
  try{
        // other bla
  } catch (Exception e) {
            System.out.println("caught exception:");
            e.printStackTrace();
  }
}

等等。 我想寫

@excepted public void foo(){
// bla
}

@excepted public void bar(){
// other bla
}

我認為這種類型的糖在python中是可能的。 在Java中有可能嗎?

你不能做像你的偽代碼建議注釋,但你可以使方法拋出:

public void bar() throws Exception {}

然后讓它一直冒出來,在任何你想要的地方捕捉它,在呼叫樹的上方(或者如果你願意的話,在呼叫堆棧中)。

在接受接口的類/方法中包裝try / catch。 將匿名實現傳遞給該類/方法。 當涉及異常處理時真的很好,否則同樣吵。

你也可以玩AOP /字節碼游戲,具體取決於實際用例。

對於問題的第一部分,在Java 7中,有一些用於捕獲重復異常的新語法糖,請看一下這篇文章

對於你的問題的第二部分,我擔心Java中沒有這樣的東西。

我的建議是使用throws Exception聲明你的方法throws Exception或者捕獲並重新拋出它們作為RuntimeExceptions

只是捕獲和打印Exceptions在實踐中是一個壞主意,因為盡管沒有從Exception恢復,但仍在繼續執行。 即使您的代碼繼續正常運行,很快您將擁有一個充滿數百個異常的日志文件,它將變得幾乎毫無價值,無法進行調試和查找有用的信息。

try {
   ...
} catch (Exception e) {
   System.out.println("caught exception:");
   e.printStackTrace();
}

現在我們有一個名為try-with-resources的語法糖try-with-resources自JDK 7以來,所以如果你正在使用資源,或者你可以將你的包裝成類似資源的類,實現AutoCloseable as

public class MyResource implements AutoCloseable {
    @Override
    public void close() throws Exception {
        System.out.println("Closed MyResource");
    }
}

那么你就可以擺脫這種負擔。

順便說一句,如果您嘗試@sarumont提到,只是讓異常冒泡,您可能會丟失原始異常(catch中的異常將隱藏try塊中的原始異常),這是不建議的,因為您使用異常故障排除,而錯誤的例外只會令人困惑。

為了這個答案,我會假設

  1. 你得到一個類Base,其中包含一大堆非異常方法,可以拋出異常。
  2. 你應該准備一個擴展Base的類,但是改變一些方法的行為以記錄異常而不是拋出它們。
  3. 您可以訪問Base的源代碼並進行修改。

你可以寫一個注釋處理器。 在Base類上添加一個注釋,告訴處理器創建Extension類。 然后在一些方法上,添加一個注釋告訴處理器記錄異常而不是丟棄它們。

根據您的具體情況,這可能比保存更多的工作(編寫和調試處理器)。

您也可以通過編寫InvocationHandler並使用Proxy來實現所需的結果。

暫無
暫無

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

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