2021. 04. 20(화) TIL
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("비밀번호가 일치하지 않습니다.");
}
...
}
- Exception 클래스를 상속받아서 사용자정의 예외 클래스를 만든다.
- 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클래스가 러메세지, 관련 예외를 저장하는 멤버변수를 가지고 있고 초기화하는 생성자도 보유하고 있기 때문에, 부모의 생성자를 통해서 객체를 초기화한다.
try {
예외발생이 예상되는 코드 // SQLException 이 발생예상됨
} catch (SQLException e) {
throw new 사용자정의예외클래스("메세지", e);
}
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();
}
}
}
Author And Source
이 문제에 관하여(2021. 04. 20(화) TIL), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@eastgun_/2021.-04.-20화-TIL저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)