Java lambda 函数:lambda 函数与 try-catch 的包装器

Java lambda functions : a wrapper for a lambda function to with try-catch

我正在寻找 lambda wrapper for the lambda function,如 post 中所述。但有一个转折。

我们有很多方法:

private void method1(RoutingContext ctx, HttpClient client) {
    doAsync1(ctx, client, asyncResult -> {
        try {
            if (asyncResult.succeeded()) {

                ctx.response().setStatusCode(200).end();
            } else {
                LOG.error("doAsync1 failed", asyncResult.cause().getMessage());
                ctx.response().setStatusCode(500);
                ctx.response().end(asyncResult.cause().getMessage());
            }
        } catch (Exception ex) {
            LOG.error("error doAsync1 failed", ex);
            ctx.response().setStatusCode(500).end();
        }
    });
}

private void method2(RoutingContext ctx, HttpClient client) {
  //... async2 ...
}

我想通过在处理程序中包装 lambda 函数来摆脱重复的 try-catch 块。我迷路了。

我如何编写函数(例如下面的 safely)来简化我的方法?

doAsync1(ctx, client, safely(asyncResult -> {
            method1(ctx, httpClient);
        }));

(尽管安全地可能是一个糟糕的选择)。它将负责错误处理部分。

 LOG.error("Failed in Parsing Json", e);
        ctx.response().setStatusCode(500);
        ctx.response().end(e.getMessage());

这里是方法处理程序中使用的功能接口的签名 doAsync1

@FunctionalInterface
public interface Handler<E> {
    void handle(E var1);
}

一个简单的解决方案如下:

private Handler<AsyncResult<String>> handleSafely(RoutingContext ctx, String method) {
    return asyncResult -> {
        ctx.response().headers().add("content-type", "application/json");

        try {
            if (asyncResult.succeeded()) {
                ctx.response().setStatusCode(200).end(asyncResult.result());
                LOG.info("asyncResult.succeeded()", asyncResult.result());
            } else {
                LOG.error(method + " failed", asyncResult.cause().getMessage());
                ctx.response().setStatusCode(500);
                ctx.response().end(asyncResult.cause().getMessage());
            }
        } catch (Exception e) {
            LOG.error("error " + method, e);
            ctx.response().setStatusCode(500).end();
        }
    };
}

这样我们就可以调用 :

private void method1(RoutingContext ctx, HttpClient client) {
    method1(ctx, client, handleSafely(ctx, "method1"));
}