[英]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.