[英]Java How to “Override” a catch block
我有辦法 此方法有一個catch塊。
// pseudo code
private void function() {
try {
// something
} catch(exception e) {
// error handling
}
}
在另一類中調用此方法。在一種情況下,該類使用其自己的catch塊實現。
// pseudo code
private void anotherFunction() {
try {
function();
} catch {
//another catch block
}
現在,我只想在調用該函數的catch塊中執行代碼,而不要調用該類中實現的catch塊。 有沒有辦法做到這一點,或者我應該考慮另一種方法嗎?
一種解決方法是將您的邏輯移至另一種不處理該異常的方法,而只是將其向上傳遞,例如:
public void unsafeFunction() throws Exception{
// something
}
然后從兩個類中調用該方法,這兩個類對異常的處理方式不同:
public void function(){
try {
unsafeFunction();
} catch(Exception e){
// error handling
}
}
和:
public void anotherFunction(){
try {
unsafeFunction();
} catch(Exception e){
// other error handling
}
}
這樣一來,您就可以將調用者的例外情況留給調用者。
另一種完全不同的方法是使用Java 8中的java.util.function.Consumer
接口並接受您的function
,然后調用者可以將錯誤處理程序傳遞給它:
public void function(Consumer<? super Exception> errorHandler){
try{
// something
} catch(Exception e){
// delegate to handler
errorHandler.accept(e);
}
}
然后可以這樣使用:
public void someFunction(){
function(e -> {
// error handling
});
}
和:
public void anotherFunction(){
function(e -> {
// other error handling
});
}
一定有理由捕獲異常。 說原因可以用另一種方法進行測試:
private boolean testCircumstanceThrowingException() {
if (exceptionalCircumstance) {
return false;
} else {
return true;
}
}
那么您可以將原始功能實現為:
private void functionCatchingException(){
if (testCircumstanceThrowingException()) {
//error handling
}
function();
}
和
private void anotherFunction() {
if (testCircumstanceThrowingException()) {
//error handling
}
function();
}
這樣,在應用程序正常運行期間,不會引發任何異常。 這是應該的,因為例外是針對特殊情況的 。 如果您以某種方式進入了預期會出現異常的狀態,則說明出現了問題。
如果沒有其他方法,則應僅依靠競爭。 例如,如果您對function
特定使用無法測試異常情況,則需要使用function
。 查看Lino的答案,以了解可能的解決方法。
Java純粹主義者會注意到,您可以簡單地return exceptionalCircumstance;
但是此代碼只是為了表明可能需要測試異常情況的函數; 結果甚至可能不是布爾值。
當然,您現在可能想要重命名functionCatchingException
:)
在您的第一個代碼段中:
private void function() {
try {
// something
}
catch (Exception e) {
// error handling
throw e; // rethrow?
}
}
Java基本上有兩種選擇。 您可以吞下該異常,也可以將其重新拋出。 如果吞下它,則此方法的調用者將不會看到異常。 如果您重新拋出,則調用方也將獲得異常。
如果這些行為都不是您真正想要的,那么您可能需要重新考慮您的設計。
您可以使用關鍵字throw
將異常拋出給調用方方法:
private void function(){
try{
//something
} catch(Exception e){
//error handling
throw e;
}
}
然后您的anotherFunction()
catch塊將被執行。
您可以從這里了解更多信息: Java教程
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.