Java : Exception(예외처리), Transaction

예외처리 (Exception)

  • 예측가능한 오류를 오류 발생없이 처리하기 위한 방법
  • 구문 오류 같은 것이 아닌 0으로 어떤 숫자를 나누는 것 같은 경우의 오류를 말한다.

    • ex) FileNotFoundException, ArithmeticException 등등…

try / catch / finally

  • try, catch는 예외처리를 위한 기본 구조이다.
  • finally는 어떤 예외가 발생하더라도 반드시 실행되어야 하는 부분이 있을 때 사용한다.
// test() 함수를 꼭 실행시켜야하는 함수라고 가정한다.
int a;

try {
  a = 4 / 0;  // 예외가 발생한 문장
} catch(ArithmeticException e) { // 어떤 숫자를 0으로 나눴을 때의 오류
  a = -1; // 예외가 발생했을 때 처리되는 부분
} finally {
  test(); // 예외가 발생하던 발생하지 않던 꼭 실행되는 구문
}

throw / throws

  • throw new : 예외를 발생시키는 키워드
  • thorws 예외를 던지는 키워드, 현재상황에서 처리하는 것이 아니라 메소드를 호출하는 곳에서 처리하도록 한다.
    • 호출 하는 부분에서 try/catch 를 해주어야 한다.
  • thorw new는 반드시 thorws를 해줘야 하지만 thorws는 반드시 thorw new를 해줄 필요는 없다.
public void divide(int a, int b) throws ArithmeticException { 
// thorw new 부분이 있으면 반드시 필요 하지만 throw new 부분이 없어도 오류나진 않는다.
  if (b==0) {
    throw new ArithmeticException();  // b가 0이면 ArithmeticException 예외를 발생시킨다. 
  }
}

public static void main(String[] args) {
try { // throws로 던졌기 때문에 호출하는 부분에서 try/catch를 해주어야 한다.
  calc.divide(10, 0);
}catch (ArithmeticException e) {
  System.out.println("0으로 나누면 안되요오~~");
}

User Exception (사용자 예외처리)

  • 발생할 예외를 개발자가 스스로 만들어서 처리를 하는 예외
  • RuntimeException이나 Exception을 상속받아 작성한다.

Exception

  • 프로그램 작성 시 발생하는 예외
  • 이미 예측가능한 예외를 작성할 때 사용한다.
  • Checked Exception 이라고도 한다.

RuntimeException

  • 실행 시 발생하는 예외
  • 사용자가 사용할 때 발생 할수도 발생 안 할수도 있는 경우에 사용한다.
  • Unchecked Exception 이라고도 한다.

사용 방법

public class ZeroException extends Exception {	// 실행 되기 전 에러가 발생한다.
	public ZeroException() {
		this("0으로 나누지 말라고");  // 예외가 발생할 시 Console 창에서 해당 텍스트를 볼 수 있다.
	}

	public ZeroException(String msg) {
		super(msg);
	}
}

public void divide(int a, int b) throws ZeroException { 
  if (b==0) {
    throw new ZeroException(); 
  }
}

Transaction

  • 트랜잭션은 하나의 작업 단위를 뜻한다.
  • 트랜잭션과 예외처리는 매우 밀접한 관련이 있다.

상품발송 예제

  • 포장, 영수증발행, 발송이라는 3가지 작업이 있는 트랜잭션을 가정해본다.
  • 이 3가지 일들 중 하나라도 실패하면 3가지 모두 취소하고 상품발송 전 상태로 되돌리고 싶을 것이다.
    • 이렇게 모두 취소하는 행위를 보통 롤백(Rollback)이라고 말한다.
// 트랜잭션 처리를 잘한 예
상품발송() {
    try {
        포장();
        영수증발행();
        발송();
    }catch(예외) {
       모두취소();
    }
}

포장() throws 예외 {
   ...
}

영수증발행() throws 예외 {
   ...
}

발송() throws 예외 {
   ...
}

// 못한 예
상품발송() {
    포장();
    영수증발행();
    발송();
}

포장(){
    try {
       ...
    }catch(예외) {
       포장취소();
    }
}

영수증발행() {
    try {
       ...
    }catch(예외) {
       영수증발행취소();
    }
}

발송() {
    try {
       ...
    }catch(예외) {
       발송취소();
    }
} 
  • 잘한 예에서는 try에 함수를 호출할 때 함수중 하나라도 오류가 발생하면 예외처리를 하게 된다.
  • 못한 예에서는 try/catch를 함수안에 구현하였기 때문에 포장은 예외처리를 하고있는데 발송이 되는 등 뒤죽박죽한 상황이 연출될 수 있다.

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

댓글남기기