백기선 자바 라이브 스터디 9: 예외 처리

Hoyoung Jung·2021년 1월 16일
0

프로그램 오류

  • 컴파일 에러: 컴파일에 실패하고 클래스를 생성하지 못함. 실행 불가능
  • 런타임 에러: 컴파일은 정상적으로 되지만 실행할 때 발생하는 에러

자바의 에러

error and exception
(출처: https://speakerdeck.com/gousiosg/exception-handling-bug-hazards-on-android?slide=8)

자바에서 에러와 익셉션은 모두 Throwable 빌트인 클래스의 하위 클래스이다.

  • error: 비정상적인 상황에서 발생하는 치명적인 오류. 자바 프로그램에서 핸들링할 수 없다. 보통 프로그램이 비정상적으로 종료된다.
  • exception: 코드로 제어할 수 있는 일반적인 오류(Ordinary programs may wish to recover an exception.)

RuntimeException

  • catch 할 수 있지만, 안 해도 된다.
  • 선언할 수 있지만, 역시 안 해도 된다.
  • 코드로 핸들링 가능

CheckedException

  • 반드시 catch해야 한다.
  • 반드시 선언해야 한다.
  • 코드로 핸들링 가능

자바의 예외 처리

  • 프로그램 실행시 발생하는 예외를 대처할 수 있는 코드를 작성하는 것을 예외 처리라고 한다.
  • 프로그램의 비정상적인 종료를 막고, 정상적인 실행상태를 유지하기 위해 예외 처리를 한다.

try, catch, finally

try {
	//예외 발생 가능한 코드들
}  catch {Exception e1} {
	//handle e1
} catch {Exception e2} {
	//handle e2
} finally {
	//예외 여부와 상관없이 무조건 실행되는 코드
}
  • try-catch는 braces 생략 불가능
  • finally는 선택적으로 사용 가능
  • 실행 순서는 try - catch - finllay
  • 주의!: try 또는 catch 문 안에서 return을 해도 이후의 finally는 반드시 수행된다.

throws

  • 메소드에서 예외를 선언할 때 사용
  • 예외를 처리하는 또 다른 방법
  • 예외가 발생하면 해당 메소드에서 처리하지 않고 호출한 쪽으로 예외를 넘겨준다.
void foo throws IOException() {
	//IOException 발생 가능한 코드	
}

void hello() {
	try {
    	foo();
    } catch (IOException e) {
    	//handling code here
    }    
}

throw

직접 예외를 발생시키기 위해 사용한다.

void foo() throws Exception {
    Exception e = new Exception("I am pooh");
    throw e;    
}

throw를 사용한 re-throwing()

예외가 발생한 메소드와 메소드를 호출한 양측 모두에서 예외 처리를 해야 하는 경우에 사용할 수 있다.


void foo() throws Exception {
	try {
    } catch (Exception e) {
    	//handle here
        throw e;
    }
}

void bar() {
	try {
    	foo();
    } catch (Exception e) {
     	//handle here 2        
    }    
}

커스텀한 예외 만들기 예제

class MyException extends Exception {
	
    private final int ERROR_CODE;
    private final int DEFALUT_ERROR_CODEE = 100;
    
    MyException(String msg, int errorCode) {
    	super(msg);
        ERROR_CODE = errCode;
    }
    
	MyException(String msg) {
    	this(msg, DEFALUT_ERROR_CODE);    	
    }
    
    public int getErrorCode() {
    	return ERR_CODE;
}
profile
주짓수를 좋아하는 개발자

0개의 댓글