Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java域异常_Java_Exception - Fatal编程技术网

Java域异常

Java域异常,java,exception,Java,Exception,我编写了一个restful web服务。RESTfulWeb服务的契约是接收参数,通过SSL与外部服务通信,并向客户端作出响应。服务合同和服务中没有任何问题。服务设计很好,所有检查过的异常都被捕获到catch块中,但是在一些服务测试之后,似乎没有正确处理未检查的异常。是否有任何方法可以使用域异常封装这些未检查的异常。简单地说,就是如何处理或预测未检查的异常。在代码中,您应该始终有一个单独的位置来处理所有异常,您所描述的内容听起来好像到处都是处理代码的乱七八糟,无论在哪里调用了声明已检查异常的方法

我编写了一个restful web服务。RESTfulWeb服务的契约是接收参数,通过SSL与外部服务通信,并向客户端作出响应。服务合同和服务中没有任何问题。服务设计很好,所有检查过的异常都被捕获到catch块中,但是在一些服务测试之后,似乎没有正确处理未检查的异常。是否有任何方法可以使用域异常封装这些未检查的异常。简单地说,就是如何处理或预测未检查的异常。

在代码中,您应该始终有一个单独的位置来处理所有异常,您所描述的内容听起来好像到处都是处理代码的乱七八糟,无论在哪里调用了声明已检查异常的方法。在遇到已检查异常的较低级别代码中使用此代码:

try { 
  ...
catch (RuntimeException e) { throw e;} 
catch (Exception e) { throw new RuntimeException(e); }
而在中央提到的例外屏障上使用

try {
  ...
catch (Throwable t) { // logging, returning error response, whatever
}
finally { // global resource cleanup
}

只有在特殊情况下才需要做更多的工作,您会发现这些情况在代码库中并不常见,也就是说,当较低级别的方法获取每个请求已经获取的资源之外的资源时。例如文件I/O。在这种情况下,当然必须使用try finally来处理额外的资源,但您仍然不能捕获并吞下异常:主要异常屏障仍然需要知道存在问题并进行清理。

RuntimeExceptions应该指示编码错误,因此,理想情况下,您应该修复错误,而不是试图处理它们。不幸的是,一些库开发人员将RTE误用为非bug,并迫使您捕获它们。您可以将RuntimeException包装到异常中

....
catch (RuntimeException e) {
    throw new MyCheckedException("Failed to...", e);
}

编辑:这几天似乎是一个有争议的观点。我知道错误检查的异常可能是一种痛苦。但是,良好地使用检查异常有助于客户机和实现人员理解契约。在不关心异常的情况下,对非bug使用RuntimeExceptions可能会使“快乐案例”中的API更容易使用,但在关心异常的情况下,要知道“悲伤案例”中的期望值就更难了。它还使接口的实现者更难知道对它们的期望是什么——它们是或不允许抛出哪些运行时异常等。

在restful web服务的特定情况下,框架有一个“全面捕获”处理程序,它可以做一些您不喜欢的事情。因此,与其他一些答案相反,添加更多或不同的处理并没有什么坏处。框架的处理程序当然不是为您清理的,因此您只能通过自己清理来让事情变得更好。因此,您有两种选择

根据JAX-RS标准,您可以将异常映射器添加到提供者列表中

您可以将代码包装在try/catch of Throwable中,然后在catch处理程序中构造对您有吸引力的响应


在不知道您使用的JAX-RS工具包的情况下,我无法更详细地介绍1。

eh看起来很像口袋妖怪异常处理:@Woot4Moo我认为您混淆了概念。只有当它被传播到代码中时,它才会是这样。一个中心的综合场所是良好实践,并在世界各地的项目中使用。大多数框架在本地支持它,捕获异常不是一个好的实践。你不可能相信你能从每一个异常中恢复过来,是吗?我当然能。如果我为一个web请求提供服务,并且抛出了一个异常,那么我将想尽一切办法:1。记录它;2.回滚所有事务;3.清理当地居民和所有其他此类状态;4.生成500内部服务器错误。但我真的很想知道是什么让你怀疑这种方法——你的专业经验有什么不同?我见过有人从文件IO错误中捕获异常,然后继续,不管日志记录如何,这并没有正确处理异常。问题发生在这样的情况下,当人们捕获到第二级异常时,唯一更糟糕的是可以丢弃,并且对于他们的代码可能处于的所有可能状态没有任何线索。进一步在异常块内进行清理只有在尝试/最终清理异常块时才有很好的成功机会,而异常块几乎总是可怕的。Try/finally-around通用方法不能保证异常状态得到处理。情况正好相反:开发人员欢迎不声明已检查异常的新库,这些库一直以来都被证明是主要的PITA。什么是和什么不是编码错误不能由库设计者预先决定。一些开发人员欢迎这样的库。一、 首先,我讨厌这种处理例外情况的方法。我理解异常处理可能会很冗长,但我不同意放弃已检查的异常并忽略运行时异常的语义是正确的方法。如果您查看JDK,您将看到RuntimeExceptions被用来指示bug,例如调用方传递了无效的参数
或者在不应该的时候调用一个方法。当然,并不是所有的编码问题都能被捕获,但是那些可以被捕获的问题都用RuntimeExceptions而不是Exceptions来表示。在JDK中命名任何选中的异常,我将命名一个只能由编码错误引发的场景。顺便说一句,你真的喜欢反射API造成的混乱吗?至少所有这些异常都应该是某个ReflectionException层次结构的一部分。至于JDK,检查过的异常现在只存在于历史原因中。如果他们能摆脱他们,他们会的。顺便说一句,我不是反对者。对,但我要说的不是,检查过的异常不能表示错误。这是运行时异常应该解决的问题。但这一点是向后的——主要要求不是在编码错误的情况下强制执行异常处理。无论如何,事实正好相反——一些未经检查的异常不是编码错误的结果,而是真正的异常和可恢复的情况。库设计者不可能从更高层次的角度了解错误的特征。我建议使用异常屏障,你建议使用异常屏障。请解释一下你的建议与我的相反。好吧,对于Restful框架来说没问题,但是对于服务层来说,如何处理这种情况,因为服务可能会调用其他服务,这些服务可能会抛出异常,我们可能不知道这可能是未检查的。有没有办法封装或捕获这些异常