2021. 04. 20(화) TIL

Dylan·2021년 4월 20일
0

Java

예외처리

사용자정의 예외클래스

  • Checked 예외클래스 만들기
    • Exception 클래스를 상속받아서 사용자정의 예외 클래스를 만든다.
  • Unchecked 예외클래스 만들기
    • RuntimeException 클래스를 상속받아서 사용자정의 예외 클래스를 만든다.
    • 현재는 대부분 Unchecked 사용자정의 예외클래스를 선호합니다.
  • 사용자정의 예외클래스 정의하기
      public class MyException extends RuntimeException {
        public MyException() {}
        public MyException(String message) {
          super(message);
        }
        public MyException(String message, Throwable cause) {
          super(message, cause);
        }
        public MyException(Throwable cause) {
          super(cause);
        }
      }
    • Throwable클래스가 러메세지, 관련 예외를 저장하는 멤버변수를 가지고 있고 초기화하는 생성자도 보유하고 있기 때문에, 부모의 생성자를 통해서 객체를 초기화한다.

예외의 변환

  • 실제 발생한 예외 대신 사용자정의 예외를 발생시키는 것
  • throw 키워드를 사용한다.
  • throw new 예외클래스(오류메세지, 실제발생한예외)
  • 여러 종류의 예외를 처리하는 것보다 사용자정의 예외만 처리하도록 하는 것이 목적이다.
  • 예외처리 변환하기
      try {
        예외발생이 예상되는 코드 // SQLException 이 발생예상됨
      } catch (SQLException e) {
        throw new 사용자정의예외클래스("메세지", e);
      }

강제 예외발생

  • 업무로직상의 오류가 있는 경우(비밀번호 불일치, 잔액부족, 로그인 실패 등) 예외를 강제로 발생시켜서 해당 기능을 호출한 측에게 오류가 발생했음을 알리는 것이다.
  • throw 키워드를 사용한다.
  • 작성예
      public void login(String id, String password) {
        User savedUser = userService.getUser(id);
        if (savedUser == null) {
          throw new UserNotFoundException("아이디가 존재하지 않습니다.");
        }
        if (!savedUser.getPasswrd.equals(password)) {
          throw new NotMatchedPasswordException("비밀번호가 일치하지 않습니다.");
        }
        ...
      }

package day2;

public class HTAUncheckedException extends RuntimeException {

	public HTAUncheckedException(String msg) {
		super(msg);
	}
	
	public HTAUncheckedException(String msg, Throwable couse) {
		super(msg, couse);
	}
}
package day2;

// 사용자 정의 예외 클래스 작성하기
public class HTACheckedException extends Exception {

	public HTACheckedException(String msg) {
		super(msg);
		
	}
	
	public HTACheckedException(String msg, Throwable cause) {
		super(msg, cause);
	}
}
package day2;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ExceptionApp2 {

	public static void test1() throws HTACheckedException {
		try {
			BufferedReader reader = new BufferedReader(new FileReader("src/day2/sample1.txt"));
			String text = reader.readLine();
			System.out.println("### 파일내용 : "+ text);
			reader.close();
		} catch (FileNotFoundException cause) {
			// FileNotFoundException을 가로채고 대신 HTACheckedException을 발생시킴
			throw new HTACheckedException("파일경로가 올바르지 않음", cause);
		} catch (IOException cause) {
			throw new HTACheckedException("파일 읽기 오류", cause);
		}
	}
	
	public static Date strToDate(String dateString) throws HTACheckedException {
		try {
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
			return format.parse(dateString);
		} catch (ParseException cause) {
			throw new HTACheckedException("올바른 날짜 형식이 아닙니다.", cause);
		}
	}
	
	public static void main(String[] args) {
		try {
			test1();
			Date day = strToDate("2021-12-25");
		} catch(HTACheckedException e) {
			e.printStackTrace();
		}
	}
}
package day2;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ExceptionApp3 {

	public static void test1() {
		try {
			BufferedReader reader = new BufferedReader(new FileReader("src/day2/sample1.txt"));
			String text = reader.readLine();
			System.out.println("### 파일 내용 : " + text);
			reader.close();
		} catch (FileNotFoundException e) {
			throw new HTAUncheckedException("파일경로가 올바르지 않습니다", e);
		} catch (IOException e) {
			throw new HTAUncheckedException("### 파일읽기 오류 발생하였습니다", e);
		}
	}
	
	// 강제 발생시킨 HTAUncheckedException 예외는 컴파일러가 예외처리 여부를 체크하지 않는 예외다.
	// 따라서, strToDate() 메소드 내부에서 HTAUncheckedException 예외를 강제 발생시켜도
	// 예외
	public static Date strToDate(String dateString) {
		try {
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
			return format.parse(dateString);
		} catch (ParseException cause) {
			throw new HTAUncheckedException("올바른 날짜 형식이 아닙니다", cause);
		}
	}
	
	public static void main(String[] args) {
		// test1()과 strToDate() 메소드는 예외처리를 강제하지 않는
		// Unchecked예외를 발생시키는 메소드다
		// test1()과 strTodate() 메소드를 사용하는 측에서는 예외처리를 하지 않아도 된다.
		test1();
		Date day = strToDate("2010-01-01");
		System.out.println(day);
		
		// 필요에 따라서 예외처리를 일괄적으로 구현해도 상관없다.
		try {
			test1();
			Date day2 = strToDate("2010-01-01");
			System.out.println(day2);
		} catch(HTAUncheckedException e) {
			e.printStackTrace();
		}
	}
}

0개의 댓글