如果抛出异常,则没有有可能指定消息的可能性



我在项目中使用春季断言,并想使用它们(或其他某些断言)来检查是否在某些情况下抛出了异常,例如我有以下代码:

//throws PatternSyntaxException in case if pattern is invalid
Pattern.compile(freeUsersRegex);
Pattern.compile(deletedUsersRegex);
Pattern.compile(movedUsersReges);
...

我想指定一条消息,以便在Regex无效(每次不同)以向用户显示哪个正则表达式无效,类似的是:

    try {
        Pattern.compile(freeUsersRegex);
    } catch (PatternSyntaxException e ) {
        throw new IllegalArgumentException("Specify valid regular expression for Free users group");
    }
    try {
        Pattern.compile(deletedUsersRegex);
    } catch (PatternSyntaxException e ) {
        throw new IllegalArgumentException("Specify valid regular expression for Deleted users group");
    }
    ...

但是,为每个字符串编写尝试/捕获不是很方便,将上述代码替换为类似的代码很酷:

Assert.isNotThrown(Pattern.compile(freeUsersRegex), PatternSyntaxException.class, "Specify valid regular expression for Free users group");
Assert.isNotThrown(Pattern.compile(deletedUsersRegex), PatternSyntaxException.class, "Specify valid regular expression for Deleted users group");

我在春季寻找这样的断言,找不到它。也许其他库中有类似的东西?

谢谢,

Andrey

为什么不简单地重复使用类型的实用程序:

public static Pattern createPattern(String regex, String type){
    try {
        return Pattern.compile(regex);
    } catch (PatternSyntaxException e ) {
        throw new IllegalArgumentException(
            String.format("Specify valid regular expression for %s", type)
        );
    }
}

您可以看一下Javaslang和Cyclop,它们都尝试实现。

独眼巨人在特定的" withCatch"阶段中仅捕获异常,这对应于初始化和主执行阶段

以下是独眼巨人尝试的示例:

Try.withCatch(()-> Pattern.compile(freeUsersRegex))
   .onFail(PatternSyntaxException.class, 
              e -> throw new IllegalArgumentException("Specify valid regular expression for Free users group"));

Javaslang尝试与Scala尝试非常相似,并将捕获在组成期间的任何阶段抛出的所有异常。

以下是Javaslang尝试的示例:

Try.of(()-> Pattern.compile(freeUsersRegex))
    .recover(e -> Match(e).of(
        Case(instanceOf(PatternSyntaxException.class), throw new IllegalArgumentException("Specify valid regular expression for Free users group")),
    ));

最新更新