pable·2021년 3월 4일
0
  • 전 회사 프로젝트에선 예외처리를 많이 사용하지 않았다. 근데 지금 회사는 정말 많이 쓴다. 그래서 한번쯤 정리하는 것이 좋다고 생각해 포스트 작성하게 되었다.

  • 해당 포스트는 예외처리의 세세한 문법까지 설명하지 않는다. 읽는 분들은 참고하시길 바란다.

에러 vs 예외

이번에 포스팅할 내용은 예외처리이지만 그 전에 에러와 예외의 차이점을 설명하고자한다.
이 둘은 모두 "오류"라는 범주에 속한다. "에러"는 발생하게 되면 사용자가 복구할 수 없는 오류를 말하고 "예외"는 발생하더라도 사용자가 수습할 수 있는 정도의 오류를 말한다. 그러므로 우리가 수습 할 수 있는 예외, 즉 "예외처리"에 대해서 중요한점 몇가지 짚어보려고 한다.

예외 처리란?

우리가 만든 프로그램은 간혹가다(...매우 자주) 오류를 일으킨다.
여기서 우리(개발자)는 오류에 대해 각자 다르게 대응할 수 있다.
예를 들면 오류를 그냥 무시하는 방법도 있고, 오류가 발생했을때 상황에 맞게 적절히 처리하는 방법도 있을 것이다.
사실 전자는 개발자로서 매우 지양해야하는 자세고, 아마 개발자라면 후자를 선택해서 오류를 처리해서 비정상 종료를 막고 실행상태를 유지시킬 것이다. 이를 예외 처리(Exception)라고 한다. 자바는 다른 언어들과 마찬가지로 try catch throw 키워드 등을 사용해서 에외 처리를 수행한다. 이 예외처리를 통해 우리 프로그램은 오류에 대해 유연하게 대응할 수 있다.

try, catch

위 예외처리의 간단한 역할을 설명하자면 try블록 안에 있는 코드에서 오류가 발생하면 catch블록에서 해당 오류를 잡아 예외처리(Exception) 한다.

예외 처리의 종류

예외처리는 크게 두가지로 나뉜다. Checked Exception, UnChecked Exception.
Checked Exception은 컴파일시 발생하는 예외다. 즉, Exceptio은 프로그램 작성시 예측가능한 예외가 있을 때 사용하고, UnChecked Exception은 발생할 수도 발생하지 않을 수도 있는 예외를 말한다. 두개의 차이점을 간단하게 정리해보자

Checked Exception

  • 반드시 예외 처리해야함.
  • 컴파일 단계에서 확인 가능
  • 대표 예외로는 IOException, SqlException 등이 있다.

UnChecked Exception

  • 예외 처리 안해도 됨
  • 런타임 단계에서 확인 가능
  • 대표 예외로는 NullPointerException, IllegalArgumentException, IndexOutOfBoundException 등이 있다.

throw, throws

throw는 프로그래머가 예외를 강제로 던질 수 있는 키워드. 그리고 throw로 예외를 던졌으면 던진 메소드 안에서 또는 상위 메소드에서 catch 블록을 생성해서 적절한 예외처리를 해줘야한다. 상위 메소드에서 예외처리를 해줄때는 예외가 발생한 현재 메소드에서 throws라는 키워드를 메소드 뒤에 붙여야지만 가능하다.

주의해야할 점은 현재 메소드에서 예외처리하는것과 상위 메소드에서 예외처리해주는것은 엄연히 다르다는 것이다. 다음 두 코드를 보자.

A. 현재 메소드에서 예외 처리하는 방법

public void func(String str){
		try {
			if ("A".equals(str)) {
				throw new Exception();
			}
		} catch(Exception e) {
			System.out.println("EQUAL!!!");
		}
		
		System.out.println("Wow");
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
			ExceptionTest t = new ExceptionTest();
			t.func("A");
			t.func("B");
	}

B. 상위 메소드에서 예외 처리하는 방법

public void func(String str) throws Exception {
		if ("A".equals(str)) {
			throw new Exception();
		}
		System.out.println("Wow");
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			ExceptionTest t = new ExceptionTest();
			t.func("A");
			t.func("B");
		} catch(Exception e) {
			System.out.println("EQUAL!!!");
		}
	}

A는 예외가 발생하고나서 func메소드에 있는 print(Wow)문을 호출하고 또한 t.func("B")메서드도 호출된다.
B는 예외가 발생하고나서 func메소드에 있는 print(Wow)문을 호출하지도 않고,t.func("B")메서드도 호출되지 않는다. 예외가 발생하자마자 catch문으로 빠져버리기 때문이다.

이처럼 exception을 어디서 처리하냐도 프로그램 실행에 있어 매우 중요하다. 그냥 내키는대로 붙여넣으면 안된다.

이는 DB의 트랜잭션 처리와도 매우 밀접하게 연관되어 있다. 이건 다음 포스트에 정리하자.

참고 : https://wikidocs.net/229

0개의 댓글