Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.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,所以,这是一个重新要求,因为它是基于意见的。所以我用更真实的方式问我的问题 因此,正如标题所说,我不确定是应该尝试实现可恢复的错误类,还是继续尝试在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所以重试模式基本上就是我现在拥有的。我想你可以说我正在努力整合重试逻辑,但我正在努力避免我所有的重试代码在数百个地方重复