java – 你怎么知道方法可以抛出的所有异常

有没有办法获得有关Java标准类的异常安全方面的一些细节?主要使用C和C#,我对Java异常规范感到困惑,所以我需要了解处理异常的正确方法.

更具体地说,让我们考虑一下ServerSocket.一旦构造了对象,它就开始侦听传入的连接.然后,您应该使用accept()来接受连接(如果有人试图连接).

如果您以前使用setSoTimeout()配置了服务器套接字,则会发生一个更改,即accept()将抛出SocketTimeoutException,因为没有人尝试在指定的时间段内连接.没关系,服务器套接字仍然可用,所以你再次调用accept().

但是SocketTimeoutException并不是accept()可能抛出的唯一东西.所有其他例外意味着什么?如果我使用2个catch子句调用accept():对于SocketTimeoutException和IOException,在进入IOException子句后,我还能安全地使用相关的ServerSocket实例吗?

我非常感谢Java范围和特定于ServerSocket的答案.

最佳答案
重用该对象是不安全的.对于这样一个问题,我总是会考虑一个来源,这就是它开放的原因.

因此,如果您查看那个:http://kickjava.com/src/java/net/ServerSocket.java.htm,您会注意到在accept()中,如果套接字关闭或不再绑定,则抛出SocketException(继承自IOException).两种状态都表明ServerSocket不再有效.

因此,对于此类,通常,如果因异常而失败,请始终尝试在finally块中正常关闭ServerSocket,然后重新创建它.

此外,在您的Java范围问题范围内:始终查看源代码并了解接口正在执行的操作.如果它是关键任务的写测试,它可以重现行为(对于这样的低级api来说应该不容易).

最后 – Java一直在做这样的事情吗?不是.有些类是无状态的,有些类不是(比如ServerSocket),有些是线程安全的,有些则不是.而且你需要理解 – 无论是从文档中还是(大部分)来自代码 – 他们构建的状态是为了理解当Exception从主路径中击出你时要做什么.

大多数人都会诅咒那些已检查的Java异常,因为大多数Java异常(与大多数IOExceptions一样)都无法以有意义的方式恢复.大多数时候,他们争辩说,你无法理解每一个细角的案例.这就是为什么许多复杂的框架可能会重试两次或三次的原因,如果他们认为可能会这样,但最终会将RuntimeException抛出到顶层框架层.在那里,他们从中创造了一些有用的东西(一个有意义的错误提供上下文)并记录他们拥有的所有细节,这在大多数情况下是一个巨大的堆栈跟踪.许多开发人员担心的大量知识资源.

那么,如果你无法从未经测试的角落问题中恢复,你会怎么做?抛出(可能有一些RuntimeException的子类)最有意义的堆栈跟踪,用你拥有的所有上下文注释.设置监控.如果遇到常见问题,请修复它.

转载注明原文:java – 你怎么知道方法可以抛出的所有异常 - 代码日志