簡體   English   中英

接口實現啟動了不同的異常

[英]Interface implementation launches different exceptions

我有一個界面

public interface DataDAO {
     public void doSomething() throws Exception;
}

假設有兩個實現,一個使用Database來獲取數據,另一個使用Webservice。

public class DataDAOJdbc implements DataDAO {
    public void doSomething() throws Exception {
         //Implement
    }
}

public class DataDAOWebService implements DataDAO {
    public void doSomething() throws Exception {
         //Implement
    }
}

正如您已經看到的,問題是啟動了超級通用異常。 因為這兩種實現都需要引發同樣的異常。

Jdbc實現實際上只引發了SQLException,而Webservice實現只會提升IOException。

問題是,我怎樣才能使界面更優雅,所以我捕獲了一個正確的異常?

我首先要創建自己的異常,並在接口級別聲明它

public interface DataDAO {
  public void doSomething() throws MyCoolException;
}

然后,當然,實施accinly。

問題是,這有意義嗎? 我從來沒有創建過我自己的異常,所以我不確定這是否有意義。 另外,在創建MyCoolException時我應該考慮什么?

我首先要創建自己的異常,並在接口級別聲明它(...)這有意義嗎?

是的,它確實有意義,我認為這是處理這些情況的最佳方式。

我將為此提供一個啟動示例(基於您當前的代碼):

public class MyCoolException extends Exception {
    public MyCoolException() {
    }
    public MyCoolException(String message) {
        this.message = message;
    }
}

public interface DataDAO {
    public void doSomething() throws MyCoolException;
}

public class DataDAOJdbc implements DataDAO {
    public void doSomething() throws MyCoolException {
         //Implement
         try {
         } catch (SQLException e) {
             //handle the exception
             logger.error("Error!", e);
             //throw your custom exception
             throw new MyCoolException(e.getMessage());
         }
    }
}

public class DataDAOWebService implements DataDAO {
    public void doSomething() throws MyCoolException {
         //Implement
         try {
         } catch (IOException e) {
             //handle the exception
             logger.error("Error!", e);
             //throw your custom exception
             throw new MyCoolException(e.getMessage());
         }
    }
}

您可以使用泛型類型來定義拋出的接口:

public interface DataDAO<E extends Throwable> {
  public void doSomething() throws E;
}

然后您的實現將如下所示:

public class DataDAOJdbc implements DataDAO<JDBCException> {
    public void doSomething() throws JDBCException {
         //Implement
    }
}

public class DataDAOWebService implements DataDAO<WebServiceException> {
    public void doSomething() throws WebServiceException {
         //Implement
    }
}

但是,這有一個缺點,你不能再以相同的方式處理所有異常,除非你只是捕獲Exception (這幾乎否定了整個點)。

這有意義嗎?

是的,它確實。 通過聲明doSomething拋出特定的已檢查異常,您向調用者發出信號,告知他們只需要捕獲並處理該特定異常。 通過聲明普通throws Exception ,將鼓勵調用者捕獲並處理所有Exception ,甚至包括運行時異常,如NullPointerException

創建MyCoolException時我應該考慮什么?

它可以像下面這樣簡單:

public final class MyCoolException extends Exception {

    public MyCoolException(Throwable cause) {
        super(cause);
    }
}

因此,您的自定義異常只會充當原因異常的包裝器,無論它是什么。 如果可能,您可以添加一條消息,其中包含可能有助於調試的其他信息。 捕獲MyCoolException時,您可以通過調用getCause()來解包它,或者將其傳遞給對日志框架的調用(其stacktrace將包括cause異常)。

暫無
暫無

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

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