Javaで複数の例外をキャッチし、例外を再スローする方法

Java 7では、catchブロックが改良され、複数の例外を単一のcatchブロックで処理できるようになりました。複数の例外をキャッチし、それらに類似したコードがある場合、この機能を使用するとコードの重複を減らすことができます。例を使ってJavaの複数の例外をキャッチする機能を理解しましょう。

Javaの複数の例外をキャッチする

Java 7以前では、以下のように一つずつ例外をキャッチしていました。

catch (IOException ex) {
     logger.error(ex);
     throw new MyException(ex.getMessage());
catch (SQLException ex) {
     logger.error(ex);
     throw new MyException(ex.getMessage());
}

Java 7では、複数の例外を単一のcatchブロックでキャッチすることができます。

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

複数の例外をキャッチする場合、パイプ(|)を使用して区切ることができます。この場合、例外パラメータ(ex)はfinalであるため、変更することはできません。この機能によって生成されるバイトコードは小さくなり、コードの冗長性が減ります。

Javaの例外の再スロー

もう一つの改善点は、コンパイラによる再スローされる例外の解析です。Javaの例外の再スローは、メソッド宣言のthrows節でより具体的な例外タイプを指定することができます。小さな例を見てみましょう:

package com.journaldev.util;

public class Java7MultipleExceptions {

	public static void main(String[] args) {
		try{
			rethrow("abc");
		}catch(FirstException | SecondException | ThirdException e){
			//下記の代入は、eがfinalであるためコンパイル時に例外が発生します
			//e = new Exception();
			System.out.println(e.getMessage());
		}
	}

	static void rethrow(String s) throws FirstException, SecondException,
			ThirdException {
		try {
			if (s.equals("First"))
				throw new FirstException("First");
			else if (s.equals("Second"))
				throw new SecondException("Second");
			else
				throw new ThirdException("Third");
		} catch (Exception e) {
			//以下の代入は、Java 7の改良された例外の再投げの型チェック機能を無効にします
			// e=new ThirdException();
			throw e;
		}
	}

	static class FirstException extends Exception {

		public FirstException(String msg) {
			super(msg);
		}
	}

	static class SecondException extends Exception {

		public SecondException(String msg) {
			super(msg);
		}
	}

	static class ThirdException extends Exception {

		public ThirdException(String msg) {
			super(msg);
		}
	}

}

rethrowメソッドでは、catchブロックはExceptionをキャッチしていますが、throws句の一部ではありません。Java 7のコンパイラは、tryブロックが投げられる例外の種類を調べ、それがcatchブロックから再投げされるかどうかを分析します。ただし、catchブロックの引数を変更すると、この分析は無効になります。詳細はこちらをご覧ください:Javaにおける例外処理

Source:
https://www.digitalocean.com/community/tutorials/java-catch-multiple-exceptions-rethrow-exception