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

时间:2018-07-18 09:08:32

标签: java exception java-7

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

GetY()

4 个答案:

答案 0 :(得分:5)

不,您不能那样做。这就是的多个catch的用途。

通过|格式,您可以将不同的异常类型组合到一个catch中,但是具有一个用于异常的公共变量。其目的是允许统一处理不同的异常类型。但是,当您希望对不同类型进行不同处理时,请使用多个catch块。

答案 1 :(得分:4)

那没有道理。当使用 multi 捕获时,您隐式地说:所有“这些”异常都应归入同一存储桶。

当然,您可以然后再创建一些instanceof if / else树,但是很麻烦:java的实现方法是每个树都有不同的catch语句。

但是,当然,根据具体情况,做类似的事情可能很实用

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

其中handle()进行了instanceof的“切换”。

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

答案 2 :(得分:3)

简而言之-不。引入了用于异常的多重捕获,以具有相同逻辑(如日志记录)的方式连接多个捕获块。所以您想在这里进行逆向工程。

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

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();
       }

    }

答案 3 :(得分:0)

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

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