是否可以在不使用多个 catch 语句的情况下捕获多个异常并对它们执行不同的逻辑?

Is it possible to catch multiple exceptions and perform different logic upon them without using multiple catch statements?

至于对异常执行不同的逻辑。如下:

catch (IOException e | IllegalArgumentException a) {

       e.doStuff();
       a.doStuff();
    }

不,你不能那样做。这就是多个 catch 用于 .

| 形式允许您将不同的异常类型组合在一个 catch 中,但异常具有一个公共变量。其目的是允许统一处理不同的异常类型。但是当你想要 disparate 处理不同的类型时,使用多个 catch 块。

这没有意义。当您使用 multi 捕获时,您是在隐含地说:所有 "these" 异常都应该落入同一个桶中。

当然,您随后可以做一些 instanceof if/else 树,但是哎呀:java 这样做的方法是为每个树设置不同的 catch 语句。

但是,当然,根据上下文,做一些类似的事情可能是务实的

 catch(XException | YException | ZException  xyOrZ) {
   log(xyOrZ);
   handle(xyOrZ);

其中 handle() 做了一些 instanceof "switching"。

长话短说:多捕获是启用适用于所有异常的方面(例如日志记录)的便捷方式。但它可能会影响您处理异常的方式。您只需平衡您的需求,并使用 您的 团队发现最适合您需求的解决方案。在某种程度上,这是关于 style,而 style 问题由代码库的工作人员决定。

简而言之 - 没有。引入了针对异常的多捕获以连接具有相同逻辑(如日志记录)的多个捕获块。所以你想在这里做一个逆向工程。

如果您想以不同的方式处理每个异常,请使用旧的表示法:

catch (IllegalArgumentException a) {
     // handle
} catch (IOException e) {
    // handle 
}

在 multicatch 块内执行此操作需要使用 instanceOf,这看起来很讨厌且可读性较差:

catch (IOException | IllegalArgumentException a) {
       if(a instanceof IOException) {
         ((IOException)a).doStuff();
       } else if(a instanceof IllegalArgumentException){
         ((IllegalArgumentException)a).doStuff();
       }

    }

是的,可以在同一个catch块中捕获多个Exception,并根据捕获到的Exception执行不同的逻辑。
例如:

catch (IOException | IllegalArgumentException e) {
if(e instanceof IOException){
//execute logic for IOException
}
else if(e instanceof IllegalArgumentException ){
//execute logic for IllegalArgumentException 
}
}