Languages/java

[JAVA] Exception

뱅타 2021. 4. 1. 22:36

Exception이란

두개의 경우로 나뉘어 진다.

  1. Error
  1. Excpetion

ctrl + 마우스 오버

여기서 Implementation으로 들어가 보면 해당 객체로 갈 수 있다.

그 후 해당 객체에 마우스를 가져다 대고 잠시 기다리면 설명글들을 읽을 수 있다.

Error는 말 그대로 심각한 문제.

그 뒷줄에 보면 should not try to catch라고 적혀있다. 말 그대로 Error는 따로 처리하려 하지 말라는말.

Exception의 경우 might want to catch.

해결할 수 있다.

Exception의 경우 두가지의 경우가 있다.

직계와 runtimeexcption

runtimeException, (unchecked exception)

Exception의 직계들인 checekd exception이 있다.(SQLException, IOException)

throws와 throw

throws의 경우 checked exception이 호출자에게 예외처리를 떠넘길 때 쓰는것.

throw의 경우 새로운 강제적인 오류를 발생시킬때 쓴다.

main에서 사용하기 때문에 main에 throws를 쓰면 VM(버츄얼머신)에게 예외처리가 넘어가게 된다.

실행 해 보면 vm이 해당 예외를 처리함.

직접 예외를 처리해 보자.

*checked와 unchecked 오류의 차이점.

  1. unchecked exception 의 경우 throws를 따로 해 주지 않더라도 알아서 넘어간다.
  1. checked의 경우 호출자에게 넘기려면 throws를 반드시 적어주어야함.
  • check의 경우 throws를 쓰지 않는다면 compile 오류가 발생한다.

예외를 따로 throws 를 주지 않더라도 계속 호출자를 타고갈 수 있다면

uunched

throws를 주지 않으면 컴파일에러가 발생하면

chedcked

메서드의 시그니쳐를 따로 건드리지 않고(throws 쓰지 않고) checked exception을 호출자에게 넘기기

checked를 unchecked로 넘겨주면 된다.

custom exception 생성하기

생성할 때 우선 unchecked Exception을 만들어야할지 checked Exception을 만들어야할지

정해서 extends를 정하면 된다.

Exception에 대한 정리

package kr.or.ddit.exception;

import java.io.IOException;
import java.sql.SQLException;

/**
 * 예외(Throwable) : 실행과정에서 발생하는 모든 비정상 상황
 *	- Error : 개발자가 처리하지 않고, VM이 제어권을 넘겨받는 예외의 한 종류(fatal error).
 *	- Exception : 개발자가 처리할 수 있는 예외
 *			- checked exception  : Exception 의 직계
 *				: 예외 발생 가능한 코드가 있으면, 반드시 처리를 해야하는 예외
 *					SQLException, IOException, SocketException
 *			- unchecked exception : RuntimeException 직계
 *				: 명시적으로 처리하지 않더라도 호출자 혹은 VM에게 제어권이 전달되는 예외
 *				NullpointerException, IllegalArgumentException
 *
 *
 *
 * ** 예외 처리 방법
 * 1. 직접 처리
 * 	try(closable 객체 생성){
 * 		예의 발생 가능 코드
 * 	} ~ catch(captuable exception){
 * 		예외 처리 코드
 *  }~ finally{
 *  	예외 발생 여부와 무관하게 처리할 코드
 *  }
 *  2. 호출자에게 위임하는 처리 : throws
 *  
 *  ** 예외 발생 방법
 *  	throw new 예외 객체 생성
 *  	(throw가 없다면 그냥 일반 객체.)
 * 
 *  
 *  ** custom 예외 정의 방법
 *  	: 상위(예외의 특성에 따라 Exception/RuntimeException)의 예외 클래스를 상속
 *  	처리하고 싶다면 exception 처리하지 못한다고 판단하면 runtime
 *  un or checked부터 정하자.
 *  
 */
public class ExceptionDesc {
	public static void main(String[] args){
//		try {
//			String retValue = method1();
//			System.out.println(retValue);
//		} catch (IOException e) {
//			e.printStackTrace();
////			throw e; catch 밖에 녀석이 실행되지 않는다. 그리고 throws를 해줘얗마.
//		}
		
		try {
			System.out.println(method2()); 
		}catch(RuntimeException e) {
			System.err.println(e.getMessage());
			throw e;
		}
	}
	
	private static String method2(){
		try {
			if(1==1)// uncheced
//			throw new IllegalArgumentException("강제발생예외");
				throw new SQLException("강제발생예외");
			return "method2RetValue";
		}catch(SQLException e) {
			// customexception으로 해서 db쪽에서만 예외가 발생햇다는 것을
			// 쉽게 알아챌 수 있다.
			throw new DataAccessException(e);
		}
	}
	
	private static String method1() throws IOException {
		try {
			if(1==1) {
	//			new IOException("강제 발생 예외");
				throw new IOException("강제 발생 예외");
			}
			return "method1RetValue";
		}catch(IOException e) {
			System.err.println("예외 발생했음."+e.getMessage());
			throw e;
		}
		
	}
}

간단한 변경.

500error(tomcat)이 서버에서 오류가 났다고 판단한 것을 400으로 바꿔보기

이렇게 try catch로 묶어서 catch 부분에 처리해 주면 된다.

500 → 400 → 500에러로 변경해주기

package kr.or.ddit.member.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import kr.or.ddit.enumpkg.ServiceResult;
import kr.or.ddit.member.UserNotFoundException;
import kr.or.ddit.service.AuthenticateServiceImpl;
import kr.or.ddit.service.IAuthenticateService;
import kr.or.ddit.service.IMemberService;
import kr.or.ddit.service.MemberServiceImpl;
import kr.or.ddit.vo.MemberVO;

@WebServlet("/mypage.do")
public class MypageServlet_sam extends HttpServlet{
	private IMemberService service = new MemberServiceImpl();
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		HttpSession session = req.getSession();
		
		MemberVO authMember = (MemberVO) session.getAttribute("authMember");
		String mem_id = authMember.getMem_id();
		try {
			MemberVO detailMember = service.retrieveMember(mem_id);
			req.setAttribute("member", detailMember);
			String view = "/WEB-INF/views/member/mypage.jsp";
			req.getRequestDispatcher(view).forward(req, resp);
		} catch (UserNotFoundException e) {
//			resp.sendError(400);
			// 500으로 다시 바꿔보기
			throw new IOException(e);
			
		}
		
	}
}

728x90
반응형