Java 是一个';可恢复错误';接口比在多个';捕捉';阻碍?
所以,这是一个重新要求,因为它是基于意见的。所以我用更真实的方式问我的问题 因此,正如标题所说,我不确定是应该尝试实现可恢复的错误类,还是继续尝试在Java 是一个';可恢复错误';接口比在多个';捕捉';阻碍?,java,exception,Java,Exception,所以,这是一个重新要求,因为它是基于意见的。所以我用更真实的方式问我的问题 因此,正如标题所说,我不确定是应该尝试实现可恢复的错误类,还是继续尝试在catch块中进行恢复 要演示的一些psuedo代码: // more or less what I have now postToServer(data) { try { socket.write(data) } //Interrupted being a custom exception catch
catch
块中进行恢复
要演示的一些psuedo代码:
// more or less what I have now
postToServer(data) {
try {
socket.write(data)
}
//Interrupted being a custom exception
catch(Interrupted ex) {
//happened twice is a common static method on all custom exceptions that returns a boolean indicating if the last thrown error is the same as this one
if(Interrupted.happenedTwice(ex)) throw ex;
else postToServer(data);
}
//another custom exception indicating that the network is unreachable
catch(NetworkDrop ex) {
if(!NetworkDrop.happenedTwice(ex) && !reconnectToServer()) throw ex;
else postToServer(data);
}
}
//What I would like to implement
interface Recoverable {
public void recover(Runnable) throws Exception;
}
class NetworkDrop extends Exception implements Recoverable {
...
public void recover(Runnable resume) {
if(!NetworkDrop.happenedTwice(this) && reconnectToServer()) resume.run();
else throw this;
}
}
class Interrupted extends Exception implements Recoverable {
...
public void recover(Runnable resume) {
if(!Interrupted.happenedTwice(this)) resume.run();
else throw this;
}
}
postToServer(data) throws Exception {
try {
socket.write(data)
}
catch(Recoverable ex) {
ex.recover(() -> postToServer(data));
}
}
作为示例,我希望所有的恢复代码都在异常中(减少重复代码,正如现在所说的,5种不同的方法可以调用recover
,而不是运行相同的恢复代码)。这将允许我捕获可以恢复的异常,但仍然抛出不可恢复的异常,或者在无法恢复时抛出异常
但我认为这有一个问题:
当从恢复中调用的中间Runnable
不返回数据时,如何在预期返回数据的方法中恢复?
假设我正在从服务器读取而不是写入,并获得一个可恢复的异常(如NetworkDrop)并成功恢复。由于执行是通过recover方法上的Runnable恢复的,并且Runnable不返回任何内容,那么调用read的函数如何从Runnable中获取数据呢
那么,这个系统会比多个捕获更有效吗?或者说,仅仅捕获可恢复异常所带来的可读性和简单性是一把双刃剑
如果折衷有利于可恢复类,我将如何解决从恢复的异常中获取返回值的问题?我看不出这种设计的任何原因,我怀疑它在非常特定和有限的用例之外是否有效。postToServer
应该不了解重试逻辑,因为重试与方法的目的无关。搜索重试模式的示例。@PM77-1我的原因与上面完全一样,我有自定义错误类,其中一些可以恢复。但是恢复代码存在于数百个位置,并且代码完全相同。不是很干。因此,因为我知道我的自定义异常可以恢复,并且恢复代码是相同的,所以将恢复代码放入一次应该是有意义的place@AndrewS有道理,我会检查的out@AndrewS所以重试模式基本上就是我现在拥有的。我想你可以说我正在努力整合重试逻辑,但我正在努力避免我所有的重试代码在数百个地方重复