【问题标题】:java callback function in case of an exception发生异常时的java回调函数
【发布时间】:2026-01-13 14:20:08
【问题描述】:

我必须实现一个回调机制以防出现异常。 假设我有一个代码来调用 like ,它需要 3 个参数 在一个名为 ServiceA 的类中

serviceA.functionA(String str1, String str2, Str3)

在 i/o 调用或对其他服务的调用中 现在如果这个调用失败,那么我需要调用另一个类似的函数 在名为 ServiceB 的类中

serviceB.functionB(String str1, String str2, Str3)..if there is an exception

如果FunctionA有任何异常应该执行functionB..或者functionA返回2xx以外的代码..

在 java 8 中使用接口的实现方式是什么。 这可以使用 lambda 和函数式接口来实现吗

我正在通过 java8 功能接口查看的代码..应该类似于这样的 try catch 块

try{
serviceA.functionA(String str1, String str2, Str3)
}
catch(Exception ex){
if(ex.errorCode != 200)
serviceB.functionB(String str1, String str2, Str3)
}

我搜索了一些在线内容..但找不到任何合适的答案

【问题讨论】:

    标签: java lambda interface callback


    【解决方案1】:

    您可以在 functionA 中处理有关异常或 != 200 的逻辑并抛出您的自定义异常(或在 functionA 的特定返回时对其进行管理),下面的异常示例:

    创建你的例外

     class MyExceptionGotInsideFunctionA extends RuntimeException {
            
     }
    

    你可以在你的函数中抛出你的新异常A

        functionA(String str1, String str2, String Str3){
    
            try{
               var reponse = otherService();
    
               if( response == 200 )  throw new MyExceptionGotInsideFunctionA("response != 200");
    
            }catch(  Exception e ){
                throw new MyExceptionGotInsideFunctionA(e.getMessage());
            }
    
        }
    
    

    处理你抛出的异常

    try{
        serviceA.functionA(String str1, String str2, Str3) // will try run
    }catch(MyExceptionGotInsideFunctionA ex){
       serviceB.functionB(String str1, String str2, Str3)
    }
    

    如果您使用从 functionA 到调用 funcionB 的简单布尔返回将更简洁和更好。

    boolean functionA(String str1, String str2, String Str3){
    
            try{
               var reponse = otherService();
    
               return response != 200;
    
            }catch(  Exception e ){
                return false;
            }
    
        }
    

    【讨论】:

    • 嗨 .. 感谢您的评论 .. 我正在寻找一种方法来通过回调函数实现这个 try catch 逻辑。使用 java 8 ..function 接口
    【解决方案2】:

    您可以尝试查看来自VAVRCyclops 的try-monads。 两者都应该能够做你想做的事。这样的事情应该是可能的:

    private void handleError(BusinessException ex) {
        if(ex.getCode() == 200) {
             serviceB.functionB(str1, str2, str3);
        }
    }
    
    private void execute() {
        Try.runWithCatch(serviceA.functionA(str1, str2, str3)).onFail(this::handleError);
    }
    

    问题是如何将 str1/str2/str3 的值传递给处理函数。

    编辑:对我来说,延长 Cyclops 尝试似乎是最好的选择。

    public class MyTry<T,X> extends Try<T,X> {    
        public Try<T,X> onFail(Predicate<X> predicate, Consumer<X> consumer)
             // filter according to to predicate
             // execute consumer
        }
    }
    

    然后你可以这样做:

    private void execute() {
        Try.runWithCatch(serviceA.functionA(str1, str2,str3)).onFail(ex -> ex.getCode() == 200, ex -> serviceB.functionB(str1, str2, str3));
    }
    

    【讨论】:

    • 嗨..感谢您的评论..虽然这看起来不错..我可能无法为这项任务包含任何库...想使用 java 的现有功能
    • 然后尝试阅读 try monad 模式并自己实现它。一个简单的实现(不支持所有用例,只支持您需要的一个)实际上不应该是很多代码。您可以查看github.com/jasongoodwin/better-java-monads/blob/master/src/main/… 并将其用作灵感并根据您的需要调整代码。