티스토리 뷰

Java

Java 예외처리하기

siyoon210 2018. 12. 18. 11:25
반응형

예외 처리 방법

메소드를 만드는 개발자 입장에서 발생하는 예외를 처리하는 방법은 2가지가 있습니다. (자세한 문법적인 설명은 이 포스팅에서 하지 않습니다.)


  1. try - catch문을 사용하기
  2. 메소드에 thorws 키워드로 예외 선언하기

try-catch문을 이용하면 예외가 발생될 것 같은 지점에 직접 예외 처리를 할 수있고, throws를 사용하게 되면 메소드를 사용하는 쪽에서 예외에 대한 처리를 해주어야 합니다. 처음 예외 처리를 배웠을때, throws로 예외를 선언하는 것은 해당 메소드를 만든 개발자로써 무책임한 방법이라고 생각했습니다. 사용자를 편하게 하는 것이 객체지향 설계의 미덕이라고 배웠는데 번거로운 예외처리를 안하겠다는 것처럼 보였습니다. 하지만 이와 같은 생각은 '언제 어떤 방법을 사용해야 하는가'에 대한 구분을 하지 못하기 때문입니다.

try-catch vs throws

메소드를 만든 사람이 바로 try-catch로 예외 처리를 한 경우, 발생할 수 있는 문제에 대해서 알아봅시다. 아래는 ArithmeticException을 발생시키는 메소드가 있는 간단한 예제 입니다.

class Calc {
    public int divide(int i, int k){
        int value = 0;
        try {
            value = i / k;
        }catch(ArithmeticException ae){
            System.out.println("0으로 나눌수 없어요.");
        }
        return value;
    }
}

public class CalcExam {
    public static void main(String[] args){
        Calc calc = new Calc();
        int value = calc.divide(4, 0);//예외 발생, 하지만 value값은 0

        System.out.println(value);
    }
}


Calc객체 divide() 메소드에서 ArithmeticException이 발생하였고, divide()메소드 내부적으로 예외 처리를 하여서 프로그램의 종료를 막을 수 있었습니다. 하지만 더 큰 문제가 있습니다. Calc객체를 이용하고 있는 main입장에서는 value값으로 0을 반환 받았기 때문입니다. 분명 divide를 이용하는 사용자가 기대한 값이 아님에도 불구하고 프로그램은 정상적으로 구동되고 있기 때문입니다. 잘못된 값을 리턴해주는 것이 프로그램의 종료보다 더 치명적일 수 있다는 사실을 염두해야합니다. 이런 경우는 차라리 divide()메소드에 throws를 명시해주고 divide()메소드를 사용하는 쪽에서 try-catch로 예외 처리를 해주는 편이 좋은 방법입니다.


위와 같은 사례로 볼 때, 개발 중 예외 처리는 throws로 예외를 명시하는 과정이 더 많이 일어나고, try-catch문으로 예외를 처리해야 하는 곳은 가능한 UI(혹은 presentation)단과 가까운 곳에서 처리하는 것이 좋습니다. (그리고 개발자도 이를 확인할 수 있도록 catch문 안에 log를 남기는 로직을 넣습니다.) 


예외 발생시키기

예외를 발생시키기 위해서는 throw new 키워드를 사용합니다. 결국 Exception도 자바 내부적인 클래스이기 때문에 예외를 발생 시키고 싶다면 new 키워드를 이용해서 인스턴스를 생성하고 throw 해야 합니다.

throw new Exeption이름

RuntimeException vs (Checked)Exception

Exception은 크게 2가지로 RuntimeException과 CheckedException로 나눌 수 있습니다. RuntimeException과 이를 상속받은 Exception에 경우 컴파일 단계에서는 문제가 없고 실행도 잘 되지만, RuntimeException을 상속 받지 않은 Exception들은 컴파일 조차 되지 않습니다. 만약 Exception을 직접 만드는 경우에는 가능한 RuntimeException을 고려해 보는 것이 좋습니다. 정말 치명적인 예외를 발생 한다고 생각 될 때 예외 처리를 강제시키는 CheckedException을 사용합니다. 참고로 RuntimeException은 throws를 선언하지 않아도 throws한 효과가 나지만,  명시적으로 하기 위해서 적는 것이 좋습니다.


반응형
댓글