본문 바로가기
Study/java

[Java]다중 Try-Catch

by 얏옹이 2022. 12. 5.
반응형

예외 처리를 하다보면 수많은 Try-catch 절을 만나게된다.

 

이놈의 이클립스는 매번 예외처리 해달라고 징징대질 않나... 근데 그걸 또 각각 try-catch 절로 묶어버리면 코드가 쓸데없이 지저분해보이고... 길어지고...

 

그런건 딱 질색이다. 코드는 최대한 간결했으면 좋겠고 명시적이였으면 좋겠으며, 중복되는 구절은 최대한 없을수록 좋다 라는게 내 신조이다.

 

이럴때 사용하는것이 다중 Try-catch이다.

 

예를들어 기존에 이클립스에서 생성해주는대로 try-catch를 처리하게되면 이런식으로 코드가 짜여질수 밖에 없다.

 

package db.dbEx2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class StringTest {
	static Connection conn = null;
	static String id = "scott";
	static String pw = "tiger";
	static String url = "jdbc:oracle:thin:@localhost:1521/xe";
	
	public static void main(String[] args) {
		
		try {
			Class.forName("oracle.jdbc.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		try {
			conn = DriverManager.getConnection(url, id, pw);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		
		
	}
	
}

 

이건 DB 연결을 위한 코드인데, 이렇게 Class.forname에 try 절 하나 들어가고

 

추가로 conn에 드라이브매니저를 통해 커넥셔를 얻는데 또한번의  try절이 들어간다.

 

이럴때 다중 다중 Try-catch절을 이용하여 조금 코드를 간결화 할수 있다.

 

일단 Try 절에 수행할 코드들을 다 합쳐놓는다.

 

그리고 두번째 Try절을 삭제후 catch 절끼리 나열해놓는다

 

package db.dbEx2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class StringTest {
	static Connection conn = null;
	static String id = "scott";
	static String pw = "tiger";
	static String url = "jdbc:oracle:thin:@localhost:1521/xe";
	
	public static void main(String[] args) {
		
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			conn = DriverManager.getConnection(url, id, pw);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		  catch (SQLException e) {
			e.printStackTrace();
		}
		
		
		
	}
	
}

 

이런식으로 나열하면 조금이라도 코드를 간결화 할수 있다.

 

다중 catch절을 사용시 유의할점이 있는데 바로 상위 예외 클래스가 catch절 상단에 와서는 안된다는 점이다

 

 

package db.dbEx2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class StringTest {
	static Connection conn = null;
	static String id = "scott";
	static String pw = "tiger";
	static String url = "jdbc:oracle:thin:@localhost:1521/xe";
	
	public static void main(String[] args) {
		
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			conn = DriverManager.getConnection(url, id, pw);
		}
		catch(Exception e) {
			
		}
		catch (SQLException e) { // 오류 Unreachable catch block for SQLException. It is already handled by the catch block for Exception
			e.printStackTrace();
		}
		
		catch (ClassNotFoundException e) { //오류 Unreachable catch block for SQLException. It is already handled by the catch block for Exception
			e.printStackTrace();
		}
		  
		
		
		
	}
	
}

 

상위 예외 클래스일수록 하단에 위치해야하고 하위 클래스 예외는 상단으로 와야한다.

 

만약 상위 예외 클래스가 상단에 위치하면 하위 예외 클래스는 작동하지 않는 코드가 되기때문에

 

Unreachable catch block for SQLException. It is already handled by the catch block for Exception 오류가 발생한다.

 

따라서 예외 클래스의 상위, 하위를 잘 구분하여서 위치에 맞게 배치해야 정상적으로 catch절에서 오류를 확인할수가 있다. 예외 클래스의 상위, 하위가 어떻게 나뉘어져 있는지는 Java API를 확인하도록 하자.

 

2022.11.08 - [Study/Site] - Java 8 API

 

 

추가로 Muity Catch(Java 7 이상에서부터 가능) 가 있는데

 

하나의 Catch절에 2개의 Exception을 기재할수가 있다

 

바로 | 연산자를 이용하는것이다.

 

package db.dbEx2;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class StringTest {
	static Connection conn = null;
	static String id = "scott";
	static String pw = "tiger";
	static String url = "jdbc:oracle:thin:@localhost:1521/xe";
	
	public static void main(String[] args) {
		
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			conn = DriverManager.getConnection(url, id, pw);
		}
		
		catch (SQLException  | ClassNotFoundException e ) {
			e.printStackTrace();
		}
		
		catch(Exception e) {
			
		}
		
	}
	
}

 

이런식으로 SQLExeption과 ClassNotFoundException을 Multi Catch로 묶어주었다. 이렇게 작성하게 되면

 

SQLException 이 발생하거나 혹은 ClassNotFoundException이 발생하면 첫번째 Catch절이 수행된다.

 

 

 

 

 

반응형