如何在java中处理一长串异常

如何在java中处理一长串异常,java,Java,我有一个Web服务器,它在服务请求时捕获一长串异常 目前,我们有一个很长的异常列表,我们处理许多catch块 有没有处理这种事情的最佳实践 我在想类似的事情 } catch (Exception e) { return handleException(e); } Response handleException(Exception e) { if (e instanceof DomainException) { //DO SOMETHING } else i

我有一个Web服务器,它在服务请求时捕获一长串异常

目前,我们有一个很长的异常列表,我们处理许多catch块

有没有处理这种事情的最佳实践

我在想类似的事情

} catch (Exception e) {
   return handleException(e);
}

Response handleException(Exception e) {
    if (e instanceof DomainException) {
       //DO SOMETHING
    } else if (e instanceof NullPointerException) {
         .
         .
         .
我不确定这是不是更干净。有什么更好的处理方法的建议吗?

如果您正在使用,那么您可以在
catch
块中使用|合并异常。例如:

catch (IOException|SQLException ex) 
如果您正在使用,则可以在
catch
块中使用|合并异常。例如:

catch (IOException|SQLException ex) 

Juned提到的Java7特性非常有用,但我很好奇为什么您首先需要这么多catch块。无论是Java7还是其他版本,都要利用该语言的异常功能

首先,确保您没有不必要地发明自己的
DomainException
s,以解决现有异常(如
IllegalArgumentException
)所解决的情况

其次,请记住检查异常和未检查异常之间的区别。选中的异常从RuntimeException的
异常
类层次结构的另一侧派生。常见的检查异常是
IOException
SQLException
,必须进行处理。任何子类化RuntimeException的东西——比如
NullPointerException
——都是未经检查的异常,不需要捕获或抛出任何东西

通常,对于可恢复的问题(客户机知道会发生什么,可以优雅地处理问题并继续)使用选中的异常,对于灾难性问题(如无法连接到数据库)使用未选中的异常


如果你能克服所有AOP的东西,这是一个关于如何有效地使用检查和未检查异常的伟大讨论。我认为这里描述的断层屏障的概念将有助于大大减少捕捉块。不再需要像在示例中那样捕获NullPointerException。

Juned提到的Java 7功能非常有用,但我很好奇,为什么您首先需要这么多捕获块。无论是Java7还是其他版本,都要利用该语言的异常功能

首先,确保您没有不必要地发明自己的
DomainException
s,以解决现有异常(如
IllegalArgumentException
)所解决的情况

其次,请记住检查异常和未检查异常之间的区别。选中的异常从RuntimeException的
异常
类层次结构的另一侧派生。常见的检查异常是
IOException
SQLException
,必须进行处理。任何子类化RuntimeException的东西——比如
NullPointerException
——都是未经检查的异常,不需要捕获或抛出任何东西

通常,对于可恢复的问题(客户机知道会发生什么,可以优雅地处理问题并继续)使用选中的异常,对于灾难性问题(如无法连接到数据库)使用未选中的异常


如果你能克服所有AOP的东西,这是一个关于如何有效地使用检查和未检查异常的伟大讨论。我认为这里描述的断层屏障的概念将有助于大大减少捕捉块。不再需要像在示例中那样捕获NullPointerException。

您是以相同的方式处理它们,还是做不同的事情?它们的处理方式不同,返回的响应略有不同,但它们之间的日志记录是常见的。如果上述方法很好地满足您的需要,那么它本身就没有问题。事实并非如此。更糟。您故意放弃了多个catch块提供的按异常类型自动选择,因此您必须自己手动重新选择。这是毫无意义的。按照设计的方式使用语言。如果需要不同的处理,请按照EJP的建议使用单独的捕获。如果处理的某些部分是通用的,则仅将该部分考虑到通用方法中。不要放弃
catch
子句中内置的特定于类型的处理,然后尝试通过测试类型来恢复它。您是以相同的方式处理它们还是执行不同的操作?它们的处理方式不同,返回稍有不同的响应,但日志记录在它们之间是常见的。如果上面的方法很适合您的需要,那么它本身并没有什么错误。事实并非如此。更糟。您故意放弃了多个catch块提供的按异常类型自动选择,因此您必须自己手动重新选择。这是毫无意义的。按照设计的方式使用语言。如果需要不同的处理,请按照EJP的建议使用单独的捕获。如果处理的某些部分是通用的,则仅将该部分考虑到通用方法中。不要放弃
catch
子句中内置的特定于类型的处理,然后尝试通过测试类型来恢复它。在任何版本的Java中,您都可以使用多个“需要捕获”异常的公共超类,假设它们都是以相同的方式处理的,并且公共超类中没有其他子类不希望被捕获。“假设它们都是以相同的方式处理的”这就是问题所在,在任何版本的Java中,您都可以使用一个包含多个“需要捕获”异常的公共超类,假设它们都以相同的方式处理,并且公共超类中没有其他子类不希望被捕获。“假设它们都以相同的方式处理”,这就是问题所在