Java 处理多个异常,但避免重复代码

Java 处理多个异常,但避免重复代码,java,exception-handling,Java,Exception Handling,我想知道我应该如何处理我的异常并且仍然避免重复代码。以下是我如何处理这种情况的想法 避免重复代码的情况(我不喜欢在这里使用instanceof) vs 没有这种情况(我真的不喜欢有重复的代码) ps:回答问题时,尽量避免java 7异常处理: catch(IOException | SomeOtherTypeException | AnotherTypeException) 编辑:我没有使用java 7,这就是为什么我要求避免基于java 7的响应。捕获原始异常,就像在第一个示例中一样,是一个

我想知道我应该如何处理我的异常并且仍然避免重复代码。以下是我如何处理这种情况的想法

避免重复代码的情况(我不喜欢在这里使用instanceof)

vs

没有这种情况(我真的不喜欢有重复的代码)

ps:回答问题时,尽量避免java 7异常处理:

catch(IOException | SomeOtherTypeException | AnotherTypeException)

编辑:我没有使用java 7,这就是为什么我要求避免基于java 7的响应。

捕获原始
异常,就像在第一个示例中一样,是一个非常糟糕的解决方案。
Exception
是应捕获和处理的已检查异常(
IOException
等)的父类;但对于
运行时异常
s,通常不应捕获的信号编程错误(未检查引用空值或数组索引等),而应予以纠正

此外,当以后修改
try
块中的代码并抛出新类型的异常时,捕获非常广泛的
异常
可能会产生一些意外的副作用:它们将被现有的
catch
块悄悄捕获

因此,我认为对于每种不同类型的异常,最好有一个不同的
catch
块,即使这意味着复制(Java7之前)一些错误处理代码

当然,限制这种代码重复的最明显的方法是用一种常见的方法将其外部化:

try {
    ... 
} catch (FooException fe) {
    handleException(fe);
} catch (BarException be) {
    handleException(be);
} 
...

private void handleException(Exception e) {
    ...
}
如果所有异常都以相同的方式严格处理,这是可以的。但是,只要您想根据确切的异常类型执行不同的操作,就需要使用
instanceof
操作符,这总是一种强烈的代码味道


总之,我个人会将错误处理代码保留在
catch
块中,即使这意味着现在有一些代码重复-从长远来看,它仍然会更加健壮。

捕获原始
异常
,就像在第一个示例中一样,是一个非常糟糕的解决方案。
Exception
是应捕获和处理的已检查异常(
IOException
等)的父类;但对于
运行时异常
s,通常不应捕获的信号编程错误(未检查引用空值或数组索引等),而应予以纠正

此外,当以后修改
try
块中的代码并抛出新类型的异常时,捕获非常广泛的
异常
可能会产生一些意外的副作用:它们将被现有的
catch
块悄悄捕获

因此,我认为对于每种不同类型的异常,最好有一个不同的
catch
块,即使这意味着复制(Java7之前)一些错误处理代码

当然,限制这种代码重复的最明显的方法是用一种常见的方法将其外部化:

try {
    ... 
} catch (FooException fe) {
    handleException(fe);
} catch (BarException be) {
    handleException(be);
} 
...

private void handleException(Exception e) {
    ...
}
如果所有异常都以相同的方式严格处理,这是可以的。但是,只要您想根据确切的异常类型执行不同的操作,就需要使用
instanceof
操作符,这总是一种强烈的代码味道


总之,我个人会将错误处理代码保留在
catch
块中,即使这意味着现在会有一些代码重复-从长远来看,它仍然会更加健壮。

我还没有测试过以下方法,但可能会有所帮助:

try{

     //some code which might throw multiple different exceptions.

} catch(Exception e) {
    if ((e instanceof IOException) || (e instanceof SomeCustomExceptionMaybe)) {
        //do something
    } else {

    }
}

我还没有测试过以下方法,但可能会有所帮助:

try{

     //some code which might throw multiple different exceptions.

} catch(Exception e) {
    if ((e instanceof IOException) || (e instanceof SomeCustomExceptionMaybe)) {
        //do something
    } else {

    }
}

第一个显而易见的解决方案是使用以下方法:

catch(IOException e1) {
    doSomethingGeneral(); 
    // do something only with this exception 
    doSomethingGeneralAgain();
}
不过,这留下了一些重复。以冗长为代价,因为Java还没有lambdas(但在Java 8中会有),所以您可以提取某个匿名类中的特定行为:

catch(IOException e1) {
    handleException(new Runnable() {
        @Override
        public void run() {
            // do something only with this exception
        }
    });
}
其中handleException()的工作方式如下:

private void handleException(Runnable specificBehavior) {
    // do something general
    specificBehavior.run();
    // do something general again
}
我迫不及待地等待Java 8,它将允许将此重写为:

catch(IOException e1) {
    handleException(() -> {
        // do something specific
    });
}

第一个显而易见的解决方案是使用以下方法:

catch(IOException e1) {
    doSomethingGeneral(); 
    // do something only with this exception 
    doSomethingGeneralAgain();
}
不过,这留下了一些重复。以冗长为代价,因为Java还没有lambdas(但在Java 8中会有),所以您可以提取某个匿名类中的特定行为:

catch(IOException e1) {
    handleException(new Runnable() {
        @Override
        public void run() {
            // do something only with this exception
        }
    });
}
其中handleException()的工作方式如下:

private void handleException(Runnable specificBehavior) {
    // do something general
    specificBehavior.run();
    // do something general again
}
我迫不及待地等待Java 8,它将允许将此重写为:

catch(IOException e1) {
    handleException(() -> {
        // do something specific
    });
}

将应该在异常块中执行的代码放入一个方法中,并从异常块中调用该方法?您能否详细说明一下为什么实际上不想使用Java 7异常处理?@CeilingGecko:我想它仍然需要一个实例进行检查。@JBNizet:或者OP没有使用Java 7。知道这一点真的很有帮助。我真的不喜欢当问题说“不要用这种方式做事”而不说原因:(@JonSkeet问题暗示了不使用多重捕获的原因:它无助于消除
instanceof
,因为它涉及到公共和特定处理。将应该在异常块中执行的代码放入一个方法中,并从异常块中调用该方法。您能否详细说明具体原因你真的不想使用Java 7异常处理吗?@CeilingGecko:我想它仍然需要一个instanceof check。@JBNizet:或者OP没有使用Java 7。知道这一点会很有帮助。我真的不喜欢问题说“不要用这种方式做事情”,而不说原因:(@JonSkeet问题暗示了不使用多重捕获的原因:它无助于消除
的instanceof
,因为它涉及到公共和特定的处理。这既不能解决instanceof,也不能解决重复代码的instanceof,因为我需要以不同的方式处理每个异常。这既不能解决instanceof ne我之所以选择重复代码,是因为我需要以不同的方式对待每个异常。在提出问题之前,我选择使用方法,但我认为可能有一种方法可以完全消除