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"));
}
我正在寻找 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"));
}