Java 捕捉多个异常、重抛异常

在Java 7中,捕获区块已改进,以处理单一捕获区块中的多个例外. 如果你捕获多个例外,并且它们有类似的代码,那么使用此功能将减少代码重复。

Java 捕捉多个例外

java catch multiple exceptions, java rethrow exceptions Before Java 7, we used to catch multiple exceptions one by one as shown below.

1catch (IOException ex) {
2     logger.error(ex);
3     throw new MyException(ex.getMessage());
4catch (SQLException ex) {
5     logger.error(ex);
6     throw new MyException(ex.getMessage());
7}

在Java 7中,我们可以在一个捕捉区块中捕捉到这两个例外,如下:

1catch(IOException | SQLException ex){
2     logger.error(ex);
3     throw new MyException(ex.getMessage());
4}

如果一个 catch 块处理多个例外,则可以使用管道分离它们,在这种情况下,例外参数(ex)是最终的,所以您不能更改它。

Java Rethrow 例外

另一个改进是编译器对重叠例外的分析。Java重叠例外允许您在方法声明的投放条款中指定更具体的例外类型。

 1package com.journaldev.util;
 2
 3public class Java7MultipleExceptions {
 4
 5    public static void main(String[] args) {
 6    	try{
 7    		rethrow("abc");
 8    	}catch(FirstException | SecondException | ThirdException e){
 9    		//below assignment will throw compile time exception since e is final
10    		//e = new Exception();
11    		System.out.println(e.getMessage());
12    	}
13    }
14
15    static void rethrow(String s) throws FirstException, SecondException,
16    		ThirdException {
17    	try {
18    		if (s.equals("First"))
19    			throw new FirstException("First");
20    		else if (s.equals("Second"))
21    			throw new SecondException("Second");
22    		else
23    			throw new ThirdException("Third");
24    	} catch (Exception e) {
25    		//below assignment disables the improved rethrow exception type checking feature of Java 7
26    		// e=new ThirdException();
27    		throw e;
28    	}
29    }
30
31    static class FirstException extends Exception {
32
33    	public FirstException(String msg) {
34    		super(msg);
35    	}
36    }
37
38    static class SecondException extends Exception {
39
40    	public SecondException(String msg) {
41    		super(msg);
42    	}
43    }
44
45    static class ThirdException extends Exception {
46
47    	public ThirdException(String msg) {
48    		super(msg);
49    	}
50    }
51
52}

正如你所看到的,在‘rethrow’ 方法中, catch block 抓取例外,但它不是投放条款的一部分。Java 7 编译器分析了完整的试用区块,以检查哪些类型的例外被扔掉,然后从 catch block 重新抓取。

Published At
Categories with 技术
Tagged with
comments powered by Disqus