병갈이 블록

예외처리에 관해서... 본문

IT(Old)/JSP 실습 과정 기록

예외처리에 관해서...

woojang 2017. 7. 14. 16:45

우선 예외처리에 관해서 어떤식으로 이루어지나 테스트를 해보았다.

여러 계층구조를 가지는 클래스 및 함수가 있다고 치자.

(A메서드를 B메서드에서 사용하고 B메서드를 C메서드에서 사용하는 경우. A->B->C )


A메서드에서 SQLException을 일으켰다. 

두가지 방법이 존재한다.

1. throws 사용.

클래스나 함수에 throws를 넣어 예외를 함수나 메서드를 호출한 곳으로 넘겨버린다.

이 경우 메서드를 사용함으로써 예외를 넘겨받게된 메서드 및 클래스에서 적절한 처리를 해야한다.

2. try-catch문 이용.

try문 안에 예외발생상황을 두고 catch문에서 SQLException을 받아 적절한 처리를 한다.

1) 자체적으로 처리.

2) 또다른 예외를 발생시켜 B메서드로 예외처리를 넘기기. ( 위 1번의 경우로 처리.)


자. 여기까지는 알았다.

하지만 이 예외를 단순히 문법적 오류해결의 수단으로 치부할 것인가, 

아니면 예외가 발생하였을때 예외 발생지역 및 원인을 찾을 수 있는 수단으로 삼을 것인가.


두번재 고민으로 예외처리를 접근해본다.

일단, 알고있는 예외 발생 수단이다.

1. Exception()

2. Exception("문자열")

3. Exception(e)    //e는 catch문으로 얻게된 예외 객체.


다시 보자.

첫번째. 그냥, 예외차체를 발생시키는 방법.

두번째. 특정 문자열을 예외 메시지에 넣어 발생시키는 방법. ( e.getMessage() 메서드로 문자열 출력이 가능)

세번째. 예외 발생 객채를 전달받아 다시 예외를 발생시키는 방법.


지금 작성중인 클래스의 함수에서 작성되어 try문과 catch문모두 사용되는 예외발생 가능 변수나 객체가 있다면 

이건 메서드의 throws로 넘기게 되고 그 외 try문 내에서만 존재가능한 변수 및 객체들은 catch문으로 처리를 한다.


나는 기본적으로 catch문으로 들어온 예외도 모두 새로운 예외를 발생시켜 throws로 넘겨버리기로 한다. 

단, 위치를 알 필요가 있는곳에서는 예외발생시 메시지를 넣어 전달한다.

A메서드 try문에서 Exception이 발생했다 치자. 그러면 catch문에서 Exception을 받게 된다.

그때 특정 메시지를 작성해서 다시 예외를 발생시켜버린다.

try{

쿼리중 예외 발생.

}catch(SQLException e){ 

throw new SQLException(e.getMessage()+"|| try - Test.java || ");

}

이렇게 하면 예외문이 발생할 때마나 메시지가 중첩되어 전달된다. 

(단, 몇몇 특수문자는 아예 문자열로 취급을 안하는 듯 하다. "&&"를 넣으니까 뒤에 문자열이 아예 전달되지 않는다.

표현식의 일부여서 그런건가...)


A->B->C라고 가정하고 A에서 예외가 발생하고 C에서는 예외를 처리한다. B는 예외를 받아 다시 전달한다.

A와 B는 아래와 같이 예외문구를 넣어 다시 예외를 발생시킨다.

A - "|| A ||"

B - e.getMessage()+"|| B ||"


C에서 catch문을 통해서 발생한 예외의 메시지를 출력해보면

"|| A |||| B ||"

라는 문자열이 출력된다.

그렇다면 이 문자를 보고 예외지역을 예상할 수 있다.

이렇게 예외발생지역을 빨리 찾을 수 있다면 더욱 빨리 논리적 오류를 잡을 수 있을 것 같다는 생각을 해보면서

다른 클래스들은 예외를 전파만 하고 핸들러 클래스에서 예외 메시지를 꺼내에 에러페이지의 파라미터로 전달하도록 구성해봤다.

그리고 특정 지역에서 임의로 예뢰를 발생시켰더니 메시지가 잘 출력된다.

음....괜찮은 생각인 듯 하다.


예외의 사용 번외.

그리고, 예외를 하나의 조건문으로 사용할 수도 있다.

특정 지역에서 특정 예외가 발생했을때 특정 페이지를 호출하도록 하는 것이다.


음....무슨말이냐 하면, 단순히 예외발생을 문법적 오류해결 및 오류처리 정도로 여기는 것 이상으로 

예외 상황을 특정한 조건으로 보고 처리를 한다는 뜻이다.


예를 들어 아이디 중복을 확인할때, 메서드를 통해서 boolean값을 받아 아이디가 존재하나 존재하지 않나를 알아볼 수도 있지만, 

아이디가 존재할때 특정 예외를 발생시켜버리는 것이다.

그러면 상위 메서드에서 아이디 체크메서드를 그냥 사용을 한다.

id가 없다면 그냥 넘어갈 것이고 id가 존재한다면 예외가 발생한다.

예외가 발생함과 동시에 아래 코드는 싹 무시되고 적절한 예외처리가 존재하는 catch문으로 점프를 한다.

그리고 그곳에서 특정 페이지로 포워딩을 한다.

이런식으로 예외를 조건문처럼(?) 사용을 할 수 있다.


오늘 이런저런 예외처리 연습과 책의 내용을 복습하면서 예외에 대한 이해를 조금 더 넓혀 본다.

만약, 수많은 예외의 이름과 사용처를 알게되면 좀더 편할 수 있을까 하는 생각도 해보게 된다.

무튼...화이팅!!!

Comments