Java 单独捕获不同的异常有什么好处吗?

Java 单独捕获不同的异常有什么好处吗?,java,exception,exception-handling,Java,Exception,Exception Handling,除了区别对待不同例外的明显情况外,单独对待例外有什么好处吗?我看到很多代码在以下几行代码中看起来有些东西: try { doSomethingThatMayThrowExceptions(); } catch (SomeException e) { } catch (OtherException e) { } 当我只有一个异常处理过程时,我总是倾向于捕获一般的异常 一个衍生问题是:如果只是一个异常,那么以任何方式陈述您捕获的异常的确切类型是否更好?例如: try { numbe

除了区别对待不同例外的明显情况外,单独对待例外有什么好处吗?我看到很多代码在以下几行代码中看起来有些东西:

try {
    doSomethingThatMayThrowExceptions();
} catch (SomeException e) {
} catch (OtherException e) {
}
当我只有一个异常处理过程时,我总是倾向于捕获一般的
异常

一个衍生问题是:如果只是一个异常,那么以任何方式陈述您捕获的异常的确切类型是否更好?例如:

try {
    number = Integer.parseInt(numberString);
} catch (Exception e) {
    // ...
}
在上面的示例中,
try
块只能抛出
NumberFormatException
。在这里捕获泛型
异常
有什么不利之处吗

在上面的示例中,try块只能抛出NumberFormatException。在这里捕获一般异常有什么不利之处吗

不是真的。但有人会问,通过“隐藏”确切的异常,你能实现什么

如果捕获到
NumberFormatException
,您可以立即看到预期将引发哪些异常

编辑:对不起。上面的示例还可以抛出未经检查的异常,例如.npe,因此您实际上捕获了更多的异常,并以相同的方式处理它们。实际上,您可能想要为这些异常实现不同的异常处理(如果您甚至想要捕获并处理未检查的异常)

在上面的示例中,try块只能抛出NumberFormatException。在这里捕获一般异常有什么不利之处吗

不是真的。但有人会问,通过“隐藏”确切的异常,你能实现什么

如果捕获到
NumberFormatException
,您可以立即看到预期将引发哪些异常


编辑:对不起。上面的示例还可以抛出未经检查的异常,例如.npe,因此您实际上捕获了更多的异常,并以相同的方式处理它们。实际上,您可能想要为这些异常实现不同的异常处理(如果您甚至想要捕获和处理未检查的异常)。

捕获异常将导致捕获未检查的异常和已检查的异常,可能是您不期望的异常。这可能会导致异常处理尝试以非预期的方式管理情况。

捕获异常将导致捕获未检查的异常以及已检查的异常,可能是您不期望的异常。这可能会导致异常处理试图以非预期的方式来管理情况。

不,实际上,它只不过是为了让您对不同的可能意外事件有一个捕获条件。一般来说,只捕获异常是不好的,因为某些操作可能会导致您需要捕获IOException和SQLException,这两种操作都需要非常不同的错误处理


在大多数情况下,您实际上需要一个catch块作为异常,这样您就有了一个通用的错误处理程序,您可以在其中清理并引发一个通用的程序错误。虽然这应该在try-catch块中的特定情况之后进行。

不,它确实可以归结为只是使它成为针对不同可能的意外事件的捕获条件。一般来说,只捕获异常是不好的,因为某些操作可能会导致您需要捕获IOException和SQLException,这两种操作都需要非常不同的错误处理


在大多数情况下,您实际上需要一个catch块作为异常,这样您就有了一个通用的错误处理程序,您可以在其中清理并引发一个通用的程序错误。虽然这应该在try-catch块中的特定情况之后出现。

对我来说,这是一个维护的事实,如果你在一年前编写了一个应用程序,并且生成了一个异常,然后你查看代码,看到
抛出异常
/
}catch(异常e)很糟糕{
,然后我需要读取方法中代码的所有Javadoc,以查看抛出的异常类型

因此,我倾向于捕捉特定类型的异常,以了解我在处理什么。
另一个例子可能是
SQLException
。在某些情况下,根据sqle的
errorCode
,我希望重试数据库操作,而在任何其他类型的异常中,我希望中止并报告。

对于我来说,这是维护的事实,如果你在一年前编写了一个应用程序,并且生成了一个异常,并且看看代码,看到
抛出异常
/
}catch(异常e){
,我需要阅读方法中代码的所有Javadoc,以查看抛出的异常类型

因此,我倾向于捕捉特定类型的异常,以了解我在处理什么。
另一个例子可能是
SQLException
。在某些情况下,根据sqle的
errorCode
,我希望重试数据库操作,而在任何其他类型的异常中,我希望中止并报告。

您主张在所有try/catch块中捕获异常?您主张捕获异常in您所有的尝试/捕获块?