Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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_Functional Programming_Refactoring - Fatal编程技术网

Java 如何干净地建立异常处理逻辑表?

Java 如何干净地建立异常处理逻辑表?,java,functional-programming,refactoring,Java,Functional Programming,Refactoring,我正在寻找一种干净且可能是功能性的方法来构造描述异常处理逻辑表的代码 | oldSave result | newSave result | action | |----------------|----------------|------------------| | success | success | - | | failure | failure | `doSomething1(

我正在寻找一种干净且可能是功能性的方法来构造描述异常处理逻辑表的代码

| oldSave result | newSave result | action           |
|----------------|----------------|------------------|
| success        | success        | -                |
| failure        | failure        | `doSomething1()` |
| failure        | success        | `doSomething2()` |
| success        | failure        | `doSomething3()` |
下面是我的解决方案的一个小玩具示例,通过捕获错误并在
joinFuture()
函数中返回它们来实现这一点。我使用空结果来描述未来调用成功的情况

public void保存(Dog对象){
#客户端支持save()方法
Future oldSave=executorService.submit(()->oldClient.save(object));
Future newSave=executorService.submit(()->newClient.save(object));
RuntimeException oldWriteException=joinFuture(oldSave);
RuntimeException newWriteException=joinFuture(newSave);
if(isSuccessful(oldWriteException)和&isSuccessful(newWriteException)){
返回;
}
如果(!isSuccessful(oldWriteException)和&!isSuccessful(newWriteException)){
doSomething1(对象、oldWriteException、newWriteException);
返回;
}
如果(isSuccessful(newWrite)){
doSomething2(对象、oldWriteException、newWriteException);
返回;
}
//新写入失败
doSomething3(对象、oldWriteException、newWriteException);
}
私有布尔值isSuccessful(运行时异常){
返回异常==null;
}
私有运行时异常joinFuture(未来){
试一试{
future.get();
返回null;
}捕捉(中断异常e){
返回新的RuntimeException(“未能从未来检索数据:+e.getCause());
}捕获(执行例外){
返回RuntimeException(例如getCause());
}捕获(运行时异常e){
返回e;
}
}

我曾想过将
joinFuture()
的结果放入一个
可选的
,但感觉很奇怪,并没有给这里的代码增加多少价值。还有其他方法可以用来实现这一点吗?

我有一段时间没有编写java代码,所以我现在可以为您指出正确的方向

我想你可以这样做:

使用将布尔值(成功/失败)映射到另一个映射的映射,该映射再次将布尔值(成功/失败)映射到方法引用

Map<Boolean, Map<Boolean, Function>> config = new Map ...
Map config=新建映射。。。
将配置表放入该映射中

然后根据isSuccessful(oldWriteException)和isSuccessful(newWriteException)的结果查找要执行的操作

然后执行该操作

也许你也会觉得这很有帮助,因为我想你需要一个三功能界面:


返回一个
enum SaveResult{SUCCESS,两者都失败,旧的失败,新的失败}
?@Michael我实际上也考虑过这一点,但只是尝试探索更优雅/功能性的方法来实现这一点(如果有的话):)