在可选orElseThrow上返回默认/通用异常

时间:2019-06-24 01:55:55

标签: java java-8 optional

我不确定我的问题的标题,但这是我的问题。我的代码如下:

Users.query.get(user_id).update(**user_info)
db.session.commit()

return Optional.of(t).filter(p -> { PolicyNumber test = (PolicyNumber) p; return service.getAndValidate(p).test(p); }).map(p -> { return p; }).orElseThrow(() -> { return null; }); 方法可以正常工作,但是当我进入getAndValidate块时(您所说的是吗?),就会触发错误。以前,我一直在使用map,我可以简单地编写类似以下内容的代码:

try...catch

因此,我可以轻松地看到骚动的全部内容。我想知道如何为try { //some code } catch (Exception e) { e.printStackTrace(); } 执行此操作。我对它很陌生,并且我想对此有所了解。我已经在线检查了教程,但是我看到的大多数内容都要求我有一个包含预定消息的类,以用作异常消息。如果仅使用Optional,显然不会收到任何错误消息,也不会了解触发了什么错误。任何建议将不胜感激

2 个答案:

答案 0 :(得分:0)

在您传递给map(在您的示例中为lambda)的方法的主体中,您可以像在任何其他方法中一样在代码周围添加try-catch块。

可选的orElseThrow方法的目的只是在可选为空时引发异常。传递给它的方法应构造要抛出的异常对象(例如RuntimeException::new),然后将其抛出。

答案 1 :(得分:0)

似乎您需要更多地研究Optional类,然后使用try ... catch(即完整的方法和您想做的事)发布不需要Optionals的代码。现在,我会猜测一下。

假设您有一个类似于以下的方法,您想在记录并忽略包装的验证逻辑中的任何异常的同时测试并返回一个对象:

static class Service {

    public <T> Predicate<T> getAndValidate(final T t) {
        return null;
    }
}

static <T> T test(final T t) {
    final Service service = null; // need to initialize properly

    // code without optional
    try {
        if (t != null) {
            if (service.getAndValidate(t).test(t)) {
                return t;
            }
        }
    } catch (final Exception e) {
        e.printStackTrace();
    }

    return null;
}

现在,使用Optional可以使相同的代码不再那么冗长。您不需要具有身份功能的map,只需使用filter并将服务调用包装为try ... catch。

static <T> T test(final T t) {
    final Service service = null;

    return Optional.ofNullable(t)
            .filter(p -> {
                try { // you can also wrap it with try..catch
                    return service.getAndValidate(p).test(p);
                } catch (final Exception e) {
                    e.printStackTrace();
                    return false; // filter element on exception
                }
            }).orElse(null);

}

但是,我会重新考虑这种方法设计。首先,捕获Exception而不是特定的子类通常不是一个好主意,尤其是如果您只是选择忽略它(仅打印堆栈跟踪),则不是一个好主意。如果您不能以有意义的方式处理该异常,为什么不让调用方进一步处理该异常呢?我会考虑返回Optional<T>而不是null(无论如何,这都是Optional的意图):

static <T> Optional<T> test(final T t) {
    final Service service = null;

    return Optional.ofNullable(t)
            .filter(p -> service.getAndValidate(p).test(p));

}

或者,您也可以选择引发有意义的异常(甚至可以创建自己的RuntimeException子类):

static <T> T test(final T t) {
    final Service service = null;

    return Optional.ofNullable(t)
            .filter(p -> service.getAndValidate(p).test(p))
            .orElseThrow(() -> new IllegalArgumentException("The validation was not successful"));

}