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