# [JAVA] μ˜ˆμ™Έ(Exception)μ²˜λ¦¬μ— λŒ€ν•΄
Study Repository

[JAVA] μ˜ˆμ™Έ(Exception)μ²˜λ¦¬μ— λŒ€ν•΄

by rlaehddnd0422

ν”„λ‘œκ·Έλž¨ 였λ₯˜ 

ν”„λ‘œκ·Έλž¨μ΄ 싀행쀑 μ–΄λ–€ 원인에 μ˜ν•΄μ„œ μ˜€μž‘λ™μ„ ν•˜κ±°λ‚˜ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜λŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•˜λŠ” 원인을 ν”„λ‘œκ·Έλž¨ 였λ₯˜λΌκ³  ν•©λ‹ˆλ‹€. 

 

였λ₯˜λŠ” λ°œμƒμ‹œμ μ„ κΈ°μ€€μœΌλ‘œ λ‚˜λˆ„λ©΄ "컴파일 μ—λŸ¬", "λŸ°νƒ€μž„ μ—λŸ¬" 둜 λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

컴파일 μ—λŸ¬

말 κ·ΈλŒ€λ‘œ 컴파일 μ‹œμ μ— λ°œμƒν•˜λŠ” μ—λŸ¬. * Checked μ˜ˆμ™Έ

 

λŸ°νƒ€μž„ μ—λŸ¬ 

μ‹€ν–‰ 도쀑에 λ°œμƒν•˜λŠ” μ—λŸ¬. * Unchecked μ˜ˆμ™Έ

 

이 외에도 논리적 μ—λŸ¬κ°€ μžˆλŠ”λ°, 논리적 μ—λŸ¬λŠ” μ»΄νŒŒμΌλ„ 잘되고 싀행도 잘 λ˜μ§€λ§Œ κ°œλ°œμžκ°€ μ˜λ„ν•œ 것과 λ‹€λ₯΄κ²Œ λ™μž‘ν•˜λŠ” μ—λŸ¬λ₯Ό λ§ν•©λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄, 창고의 μž¬κ³ κ°€ μŒμˆ˜κ°€ λœλ‹€κ±°λ‚˜ ν•˜λŠ” λ“±μ˜ μ—λŸ¬

 

μžλ°”μ—μ„œλŠ” μ‹€ν–‰ μ‹œ λ°œμƒν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž¨ 였λ₯˜λ₯Ό 'μ—λŸ¬'와 'μ˜ˆμ™Έ' λ‘κ°€μ§€λ‘œ κ΅¬λΆ„ν•©λ‹ˆλ‹€.

 

μ—λŸ¬λŠ” ν”„λ‘œκ·Έλž¨ μ½”λ“œλ‘œ μˆ˜μŠ΅ν•  수 μ—†λŠ” μ‹¬κ°ν•œ 였λ₯˜λ‘œ 예λ₯Ό λ“€λ©΄ λ©”λͺ¨λ¦¬ λΆ€μ‘±(OutofMemeoryError), μŠ€νƒ μ˜€λ²„ ν”Œλ‘œμš°(StackOverflowError)κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ—λŸ¬λŠ” 일단 λ°œμƒν•˜λ©΄ ν”„λ‘œκ·Έλž¨ 싀행쀑에 볡ꡬ할 수 μ—†κΈ° λ•Œλ¬Έμ— 비정상적인 μ’…λ£Œλ₯Ό 막을 길이 μ—†μ§€λ§Œ, μ—λŸ¬μ™€ 달리 μ˜ˆμ™ΈλŠ” κ°œλ°œμžκ°€ 이에 λŒ€ν•΄ μ μ ˆν•œ μ½”λ“œλ₯Ό 미리 μž‘μ„±ν•΄ λ†“μŒμœΌλ‘œμ¨ ν”„λ‘œκ·Έλž¨μ˜ 비정상적인 μ’…λ£Œλ₯Ό 막을 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μžλ°”λŠ” μ‹€ν–‰ μ‹œ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό 클래슀둜 μ •μ˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μ˜ˆμ™Έ 클래슀의 계측ꡬ쑰λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ Exception(μ˜ˆμ™Έ)와 Error(μ—λŸ¬)둜 λ‚˜λˆ„μ–΄μ Έ μžˆμŠ΅λ‹ˆλ‹€.

Exception ν΄λž˜μŠ€λŠ” λͺ¨λ“  μ˜ˆμ™Έμ˜ 쑰상 클래슀 이며, Exception λ˜ν•œ Checked μ˜ˆμ™Έμ™€ Unchecked μ˜ˆμ™Έλ‘œ λ‚˜λˆ„μ–΄μ Έ μžˆλŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

Chekced / Unchecked Exception

  • Unchecked μ˜ˆμ™ΈλŠ” μ‹€ν–‰ 도쀑 λ°œμƒν•˜λŠ” μ˜ˆμ™Έλ‘œ RuntimeException을 μΉ­ν•˜λ©°, 개발자의 μ‹€μˆ˜μ— μ˜ν•΄μ„œ λ°œμƒλ  수 μžˆλŠ” μ˜ˆμ™Έλ“€λ‘œ μžλ°”μ˜ ν”„λ‘œκ·Έλž˜λ° μš”μ†Œλ“€κ³Ό 관계가 κΉŠμ€ μ˜ˆμ™Έμž…λ‹ˆλ‹€. 
  • μ€‘μš”ν•œ 점은 Unchecked μ˜ˆμ™Έ (RuntimeException)λŠ” κ°œλ°œμžμ— μ˜ν•΄ μ‹€μˆ˜λ‘œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έμ΄κΈ° λ•Œλ¬Έμ— μ˜ˆμ™Έμ— λŒ€ν•œ μ²˜λ¦¬κ°€ κ°•μ œλ˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ μž…λ‹ˆλ‹€. 
    • 예λ₯Ό λ“€λ©΄ κ°’μ˜ null인 μ°Έμ‘°λ³€μˆ˜μ˜ 멀버λ₯Ό ν˜ΈμΆœν•˜λ € ν–ˆλ‹€λ˜μ§€(NullPointerException), μ •μˆ˜λ₯Ό 0으둜 λ‚˜λˆ„λ €κ³  ν–ˆλ‹€λ˜μ§€ ν•˜λŠ” κ²½μš°μ— λ°œμƒν•˜λŠ” μ˜ˆμ™Έ(ArithmeticException)κ°€ μžˆμŠ΅λ‹ˆλ‹€.
  • Checked μ˜ˆμ™ΈλŠ” RuntimeException을 μ œμ™Έν•œ λͺ¨λ“  μ˜ˆμ™Έλ‘œ ν”„λ‘œκ·Έλž¨μ˜ μ‚¬μš©μžλ“€μ˜ λ™μž‘μ— μ˜ν•΄μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ
    • 예λ₯Ό λ“€λ©΄ μž…λ ₯ν•œ 데이터 ν˜•μ‹μ΄ 잘λͺ»λœ ν˜•μ‹μ΄κ±°λ‚˜, μ‹€μˆ˜λ‘œ 클래슀의 이름을 잘λͺ» μ μ—ˆλ‹€λ˜μ§€ ν•˜λŠ” κ²½μš°μ— λ°œμƒν•˜λŠ” μ˜ˆμ™Έκ°€ λ°”λ‘œ Checked μ˜ˆμ™Έμž…λ‹ˆλ‹€.
    • Checked μ—μ™ΈλŠ” μ˜ˆμ™Έμ— λŒ€ν•œ μ²˜λ¦¬κ°€ κ°•μ œλ˜κΈ° λ•Œλ¬Έμ— κ°œλ°œμžλŠ” Checked μ˜ˆμ™Έμ— λŒ€ν•œ 처리λ₯Ό λ°˜λ“œμ‹œ ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.
Exception 클래슀 : μ‚¬μš©μžμ˜ μ‹€μˆ˜μ™€ 같이 외적 μš”μΈμ— μ˜ν•΄ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ 
RuntimeException ν΄λž˜μŠ€λ“€ : 개발자의 μ‹€μˆ˜λ‘œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ 

μ˜ˆμ™Έ 처리 : try-catch(+finally) λ¬Έ

ν”„λ‘œκ·Έλž¨ 싀행도쀑에 λ°œμƒν•˜λŠ” μ˜ˆμ™ΈλŠ” κ°œλ°œμžκ°€ 이에 λŒ€ν•΄ 미리 처리λ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€. 이λ₯Ό μ˜ˆμ™Έ 처리라고 μΉ­ν•©λ‹ˆλ‹€.

 

μ˜ˆμ™Έ 처리의 λͺ©μ  : ν”„λ‘œκ·Έλž¨μ˜ 비정상적인 μ’…λ£Œλ₯Ό 막고, 정상적인 μ‹€ν–‰μƒνƒœλ₯Ό μœ μ§€ν• μˆ˜ μžˆλ„λ‘ ν•˜κΈ° μœ„ν•¨.

 

μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” try-catch문을 μ‚¬μš©ν•˜λ©°, κ΅¬μ‘°λŠ” μ΄λ ‡μŠ΅λ‹ˆλ‹€.

try{
    /* μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλŠ” λ¬Έμž₯ */
}
catch(/* try λ¬Έμ—μ„œ λ°œμƒν•œ μ˜ˆμ™Έ1 */){ /* μ˜ˆμ™Έ1에 λŒ€ν•œ 처리 λ¬Έμž₯ */ }
catch(/* try λ¬Έμ—μ„œ λ°œμƒν•œ μ˜ˆμ™Έ2 */){ /* μ˜ˆμ™Έ2에 λŒ€ν•œ 처리 λ¬Έμž₯ */}
catch(/* try λ¬Έμ—μ„œ λ°œμƒν•œ μ˜ˆμ™Έ3 */){ /* μ˜ˆμ™Έ3에 λŒ€ν•œ 처리 λ¬Έμž₯ */}

try λ¬Έμ—μ„œ λ°œμƒν•œ μ˜ˆμ™Έμ™€ μΌμΉ˜ν•˜λŠ” μ˜ˆμ™Έκ°€ catch문에 μ—†μœΌλ©΄ ν•΄λ‹Ή μ˜ˆμ™ΈλŠ” μ²˜λ¦¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

try λΈ”λŸ­ λ‚΄μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•œ 경우 

-  λ°œμƒν•œ μ˜ˆμ™Έμ™€ μΌμΉ˜ν•˜λŠ” catch λΈ”λŸ­μ΄ μžˆλŠ”μ§€ 확인 -> μΌμΉ˜ν•˜λŠ” catchλΈ”λŸ­ 발견 μ‹œ λΈ”λž™ λ‚΄μ˜ λ¬Έμž₯ μˆ˜ν–‰ -> try-catchλ¬Έ λΉ μ Έλ‚˜μ˜΄.

-  λ§Œμ•½ μΌμΉ˜ν•˜λŠ” catchλΈ”λŸ­μ΄ μ—†μœΌλ©΄ ν•΄λ‹Ή μ˜ˆμ™ΈλŠ” μ²˜λ¦¬λ˜μ§€ λͺ»ν•˜κ³  λΉ μ Έλ‚˜μ˜΅λ‹ˆλ‹€.

 

try λΈ”λŸ­ λ‚΄μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ€ 경우

- try-catch문을 λΉ μ Έλ‚˜μ˜΄.

 

λͺ¨λ“  μ˜ˆμ™Έμ˜ 쑰상 μ˜ˆμ™ΈμΈ Exception을 catch λΈ”λŸ­μ— μ‚¬μš©ν•˜κ²Œ 되면 μ–΄λ–€ μ’…λ₯˜μ˜ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ”λΌλ„ μ²˜λ¦¬ν•˜κ²Œ λ©λ‹ˆλ‹€. (λ‹€ν˜•μ„±)

 

try-catchλ¬Έ λ’€μ—λŠ” finallyλ₯Ό μΆ”κ°€ν•˜μ—¬ try-catchλ¬Έμ—μ„œ μ˜ˆμ™Έμ˜ λ°œμƒμ—¬λΆ€μ™€ 상관없이 μ‹€ν–‰λ˜μ–΄μ•Ό ν•  μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

try
{
...
}catch(Exception1 e1)
{// Exception1에 λŒ€ν•œ 처리 λ¬Έμž₯}
finally{
	// μ˜ˆμ™Έμ˜ λ°œμƒμ—¬λΆ€μ™€ 관계없이 항상 μˆ˜ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” λ¬Έμž₯
}

이 경우 μ˜ˆμ™Έ λ°œμƒν•˜λ©΄ try->catch->finally 순으둜 μ‹€ν–‰

μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•ŠμœΌλ©΄ try->finally 순으둜 μ‹€ν–‰


μ˜ˆμ™Έμ˜ printStackTrace(), getMessage() λ©”μ†Œλ“œ

μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ μƒμ„±λ˜λŠ” μ˜ˆμ™Έ 클래슀의 μΈμŠ€ν„΄μŠ€μ—λŠ” λ°œμƒν•œ μ˜ˆμ™Έμ— λŒ€ν•œ 정보가 담겨져 μžˆμŠ΅λ‹ˆλ‹€. 이 정보듀은  getMessage()와 printStackTrace()λ₯Ό 톡해 μ‹œμŠ€ν…œ μ½˜μ†”μ— 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@Test
void printEx() {
    Controller controller = new Controller();
    try {
        controller.request();
    } catch (Exception e) {
        // void
        e.printStackTrace();
        
        // String
        String message = e.getMessage();
        System.out.println("message = " + message);
    }
}

 

이처럼 try-catch문으둜 μ˜ˆμ™Έκ°€ λ°œμƒν•΄λ„ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ§€ μ•Šλ„λ‘ ν•΄μ£ΌλŠ” λ™μ‹œμ— λ©”μ†Œλ“œλ₯Ό 톡해 μ˜ˆμ™Έμ˜ λ°œμƒ 원인을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.


μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ λ§Œλ“€κΈ°

λͺ¨λ“  μ˜ˆμ™Έμ˜ μ‘°μƒν΄λž˜μŠ€μΈ Exception을 상속받아 μƒˆλ‘œμš΄ μ˜ˆμ™Έ 클래슀λ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class MyException extends Exception
{
	MyException(String msg) // String을 λ§€κ°œλ³€μˆ˜λ‘œ λ°›λŠ” μƒμ„±μž msg : μ—λŸ¬λ©”μ‹œμ§€
    {
    super(msg); // 쑰상인 Exception 클래슀의 μƒμ„±μžλ₯Ό 호좜 
    }
}

 

기쑴의 μ˜ˆμ™Έ ν΄λž˜μŠ€λŠ” 주둜 Exception을 상속받아 Chekcedμ˜ˆμ™Έλ‘œ μž‘μ„±ν•˜λŠ” κ²½μš°κ°€ λ§Žμ•˜μ§€λ§Œ, μš”μ¦˜μ—λŠ” λ’€μ—μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•  방법쀑 ν•˜λ‚˜μΈ μ˜ˆμ™Έμ „ν™˜ 방법을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ RuntimeException을 상속받아 μž‘μ„±ν•˜λŠ” μͺ½μ„ μ„ νƒν•˜κΈ°λ„ ν•©λ‹ˆλ‹€.


μ˜ˆμ™Έ λ°œμƒμ‹œν‚€κΈ° by throw

ν‚€μ›Œλ“œ throwλ₯Ό μ‚¬μš©ν•΄μ„œ κ°œλ°œμžκ°€ 고의둜 μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

 

1. λ¨Όμ € μ—°μ‚°μž newλ₯Ό μ΄μš©ν•΄μ„œ λ°œμƒμ‹œν‚€λ €λŠ” μ˜ˆμ™Έ 클래슀의 객체λ₯Ό λ§Œλ“  λ‹€μŒ

Exception e = new Exception("고의둜 λ°œμƒμ‹œν‚¨ μ˜ˆμ™Έ");

2. throw ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

throw e;

λ°œμƒν•œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” λ°©λ²•μ—λŠ” 3가지 방법이 μžˆμŠ΅λ‹ˆλ‹€.

 

μ˜ˆμ™Έ 처리 방법

μ˜ˆμ™Έμ²˜λ¦¬ 방법 1. μ˜ˆμ™Έ 볡ꡬ try-catchλ¬Έ

public void callCatch()
{
    try {
        repository.call();
    } catch (MyCheckedException e) {
        // μ˜ˆμ™Έ 처리 둜직
        log.info("μ˜ˆμ™Έ 처리, message = {}",e.getMessage(),e);
    }
}

/**
 * λ‚΄λ˜μ Έμ§„ μ˜ˆμ™Έ λ˜μ§€κΈ°
 * 체크 μ˜ˆμ™ΈλŠ” μ˜ˆμ™Έλ₯Ό μž‘μ§€ μ•Šκ³  λ°–μœΌλ‘œ λ˜μ§€λ €λ©΄ throws μ˜ˆμ™Έλ₯Ό λ©”μ†Œλ“œμ— ν•„μˆ˜λ‘œ 선언해야함
 * @throws MyCheckedException
 */
public void callThrow() throws MyCheckedException {
    repository.call();
}
  • callCatch() : λ„˜μ–΄μ˜¨ μ˜ˆμ™Έλ₯Ό 처리
    • try-catch문을 μ΄μš©ν•΄ try문의 repository.call()에 μ˜ν•΄ λ°œμƒν•œ μ˜ˆμ™Έλ₯Ό catch λΈ”λŸ­μ—μ„œ 둜그λ₯Ό 남기고 λλƒ„μœΌλ‘œμ¨ λ‹€λ₯Έμž‘μ—… νλ¦„μœΌλ‘œ μœ λ„ν–ˆμŠ΅λ‹ˆλ‹€.
    • ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό μž‘μ•„μ„œ 볡ꡬ(처리)ν–ˆκΈ°λ•Œλ¬Έμ— throws ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ μ˜ˆμ™Έλ₯Ό λ‚΄λ˜μ§ˆ ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

μ˜ˆμ™Έμ²˜λ¦¬ 방법 2. μ˜ˆμ™Έ νšŒν”Ό by throws 

μ˜ˆμ™Έκ°€ λ°œμƒν•œ ν•΄λ‹Ή λ©”μ†Œλ“œμ—μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜μ§€ λͺ»ν•˜λŠ” 경우,

ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ λ©”μ†Œλ“œμ—κ²Œ μ˜ˆμ™Έλ₯Ό 던짐으둜써 ν•΄λ‹Ή λ©”μ†Œλ“œμ—μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜μ§€ λͺ»ν•˜μ˜€μŒμ„ μ•Œλ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ™Έ μ€‘μ—μ„œλ„ Checked μ˜ˆμ™Έ 일 λ•ŒλŠ” μ½”λ“œλ₯Ό ν†΅ν•œ μ˜ˆμ™Έμ²˜λ¦¬κ°€ ν•„μˆ˜μ μ΄κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή λ©”μ†Œλ“œμ—μ„œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν•˜λŠ” 경우 throws ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ μ˜ˆμ™Έλ₯Ό λ„˜κ²¨μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

Checked μ˜ˆμ™ΈλŠ” λ°˜λ“œμ‹œ μ²˜λ¦¬λ˜κ±°λ‚˜ λ„˜κ²¨μ£Όκ±°λ‚˜ λ‘˜ 쀑 ν•˜λ‚˜ ν•„μˆ˜.
* RuntimeException(Unchekced μ˜ˆμ™Έ)은 λ„˜κ²¨μ£Όμ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

 

ν˜ΈμΆœν•œ λ©”μ†Œλ“œμ—κ²Œ μ˜ˆμ™Έλ₯Ό λ„˜κΈ°κΈ° μœ„ν•΄μ„œλŠ” 호좜된 ν•΄λ‹Ή λ©”μ†Œλ“œ 뒀에 throws ν‚€μ›Œλ“œμ™€ ν•¨κ»˜ ν•΄λ‹Ή λ©”μ†Œλ“œμ—μ„œ λ°œμƒν•œ μ˜ˆμ™Έ ν˜Ήμ€ ν•΄λ‹Ή λ©”μ†Œλ“œκ°€ ν˜ΈμΆœν•œ λ©”μ†Œλ“œκ°€ μ²˜λ¦¬ν•˜μ§€ λͺ»ν•΄μ„œ λ„˜μ–΄μ˜¨ μ˜ˆμ™Έ λ₯Ό μž‘μ„±ν•΄ μ£Όλ©΄ λ©λ‹ˆλ‹€.

 

public void callCatch()
{
    try {
        repository.call();
    } catch (MyCheckedException e) {
        // μ˜ˆμ™Έ 처리 둜직
        log.info("μ˜ˆμ™Έ 처리, message = {}",e.getMessage(),e);
    }
}

/**
 * λ‚΄λ˜μ Έμ§„ μ˜ˆμ™Έ λ˜μ§€κΈ°
 * 체크 μ˜ˆμ™ΈλŠ” μ˜ˆμ™Έλ₯Ό μž‘μ§€ μ•Šκ³  λ°–μœΌλ‘œ λ˜μ§€λ €λ©΄ throws μ˜ˆμ™Έλ₯Ό λ©”μ†Œλ“œμ— ν•„μˆ˜λ‘œ 선언해야함
 * @throws MyCheckedException
 */
public void callThrow() throws MyCheckedException {
    repository.call();
}
  • callThrow() : λ„˜μ–΄μ˜¨ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜μ§€ λͺ»ν•˜κ³  λ˜μ§€κΈ°
    • repository.call()μ—μ„œ λ°œμƒν•œ μ˜ˆμ™Έλ₯Ό λ©”μ†Œλ“œ 뒀에 throws ν‚€μ›Œλ“œ + λ„˜κ²¨λ°›μ€ μ˜ˆμ™Έλ₯Ό μž‘μ„±ν•΄ μžμ‹  λ˜ν•œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν•˜μ˜€μŒμ„ μ•Œλ¦¬κ³  callThrow()λ₯Ό ν˜ΈμΆœν•œ λ©”μ†Œλ“œμ—κ²Œ μ˜ˆμ™Έλ₯Ό λ˜μ§‘λ‹ˆλ‹€.

+ try-catchλ¬Έκ³Ό throws ν‚€μ›Œλ“œλ₯Ό λͺ¨λ‘ μ΄μš©ν•˜μ—¬ ν˜„μž¬ λ©”μ†Œλ“œμ™€ ν˜ΈμΆœν•œ λ©”μ†Œλ“œμ—μ„œ μ˜ˆμ™Έλ₯Ό λ‚˜λˆ„μ–΄μ„œ μ²˜λ¦¬ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

public void excute1() throws Exception1
{
    try
    {
        repository.call(); // Exception1 , Exception2 λ°œμƒ 
    }
    catch(Exception2 e)
    {
        // repository.call()μ—μ„œ λ„˜κ²¨λ°›μ€ Exception2 처리
    }
}

μ˜ˆμ™Έ μ²˜λ¦¬λ°©λ²• 3. μ˜ˆμ™Έ μ „ν™˜ν•˜κΈ°

Unchecked μ˜ˆμ™Έ (RuntimException) 은 μ˜ˆμ™Έμ²˜λ¦¬κ°€ κ°•μ œλ˜μ§€ μ•ŠλŠ”λ‹€κ³  ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

  • 체크 μ˜ˆμ™Έ : μ˜ˆμ™Έλ₯Ό μž‘μ•„μ„œ μ²˜λ¦¬ν•˜μ§€ μ•ŠμœΌλ©΄ λ°˜λ“œμ‹œ throws에 λ˜μ§€λŠ” μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•΄μ•Ό 함.
  • 언체크 μ˜ˆμ™Έ : μ˜ˆμ™Έλ₯Ό μž‘μ•„μ„œ μ²˜λ¦¬ν•˜μ§€ μ•Šμ•„λ„ throws μƒλž΅ κ°€λŠ₯. ( 처리 κ°•μ œμ„± X )

Unchecked μ˜ˆμ™ΈλŠ” μ‹ κ²½μ“°κ³  싢지 μ•Šμ€ μ˜ˆμ™Έλ“€μ„ λ¬΄μ‹œν•  수 있기 λ•Œλ¬Έμ—, throws μ˜ˆμ™Έλ₯Ό μƒλž΅ν•  수 μžˆμ„ 뿐만 μ•„λ‹ˆλΌ, μ‹ κ²½μ“°κ³  싢지 μ•Šμ€ μ˜ˆμ™Έμ˜ μ˜μ‘΄κ΄€κ³„λ₯Ό μ°Έμ‘°ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.

 

 

Chekced μ˜ˆμ™Έμ˜ 경우

각 λ©”μ†Œλ“œκ°€ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜μ§€ λͺ»ν•˜κ³  λ„˜κ²¨μ€„ λ•Œ λ©”μ†Œλ“œ λͺ¨λ‘ throws μ˜ˆμ™Έμ— μ˜μ‘΄ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.  

λ§Œμ•½ JDBC κΈ°μˆ μ—μ„œ JPA 기술둜 λ°”κΎΌλ‹€λ©΄ SQLException에 μ˜μ‘΄ν•˜λ˜ λͺ¨λ“  μ„œλΉ„μŠ€, 컨트둀러λ₯Ό JPAException에 μ˜μ‘΄ν•˜λ„λ‘ 고쳐야 ν•©λ‹ˆλ‹€. 

logic() throws SQLException β–ΆοΈŽ logic() throws JPAException

* throws Exception으둜 ν†΅μΌν•˜κ²Œ 되면 λ‹€λ₯Έ μ²΄ν¬μ˜ˆμ™Έλ₯Ό μ²΄ν¬ν• μˆ˜ μžˆλŠ” κΈ°λŠ₯이 λ¬΄νš¨ν™”λ˜κΈ° λ•Œλ¬Έμ— ꢌμž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

이럴 λ•Œ μ‚¬μš©ν•˜λŠ” 방법이 μ˜ˆμ™Έ μ „ν™˜μž…λ‹ˆλ‹€. (Checked μ˜ˆμ™Έλ₯Ό Unchecked μ˜ˆμ™Έλ‘œ μ „ν™˜)

static class Service
{
    NetworkClient networkClient = new NetworkClient();
    Repository repository = new Repository();

    public void logic(){
        repository.call();
        networkClient.call();
    }
}

static class NetworkClient
{
    public void call(){
        // Unchecked exception λ‚΄λ˜μ§€κΈ°
        throw new RuntimeConnectException("μ—°κ²° μ‹€νŒ¨"); // extends RuntimeException
    }
}

static class Repository {
    public void call() {
        try {
            runSQL(); // SQLException ( Chekced Exception ) λ°œμƒ 
            // catchλ¬Έμ—μ„œ 체크 -> 언체크(λŸ°νƒ€μž„) λ³€κ²½ν•΄μ„œ λ‚΄λ˜μ§€κΈ°
        } catch (SQLException e) {
            throw new RuntimeSQLException(e); // extends RuntimeException
        }
    }

    private void runSQL() throws SQLException {
        throw new SQLException("ex");
    }
}

 

try - catch문을 μ΄μš©ν•΄ tryλ¬Έμ—μ„œ λ°œμƒν•œ Checkedμ˜ˆμ™Έλ₯Ό catchλ¬Έμ—μ„œ Uncheckedμ˜ˆμ™Έλ‘œ λ³€κ²½ν•΄μ„œ λ˜μ Έμ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ™Έμ „ν™˜ 방식 적용

  • μ˜ˆμ™Έμ „ν™˜ 방식을 μ‚¬μš©ν•΄ Unchecked μ˜ˆμ™Έλ‘œ λ³€κ²½ν•΄μ„œ 던쑌기 λ•Œλ¬Έμ—, μ„œλΉ„μŠ€κ³„μΈ΅μ˜ logic() λ©”μ†Œλ“œμ—μ„œλŠ” throws ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•΄ 이제 더 이상 throws μ˜ˆμ™Έμ— μ˜μ‘΄ν•˜μ§€ μ•Šκ²Œ λ©λ‹ˆλ‹€.
  • λ”°λΌμ„œ SQLException에 μ˜μ‘΄ν•˜μ§€ μ•Šκ²Œ λ˜μ–΄ JDBCμ—μ„œ JPA 기술둜 λ³€κ²½λ˜μ–΄λ„ μ„œλΉ„μŠ€ κ³„μΈ΅μ˜ μ½”λ“œλ₯Ό μˆ˜μ •ν•  ν•„μš”κ°€ μ—†μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

μ˜ˆμ „μ—λŠ” Chekcedμ˜ˆμ™Έλ₯Ό 자주 μ‚¬μš©ν–ˆμ§€λ§Œ throws ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ£Όμ–΄μ•Ό ν•˜λŠ” λ²ˆκ±°λ‘œμ›€ λ•Œλ¬Έμ— 졜근 λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ€ λŒ€λΆ€λΆ„ Unchecked (λŸ°νƒ€μž„μ˜ˆμ™Έ) λ₯Ό 기본으둜 μ œκ³΅ν•œλ‹€κ³  ν•©λ‹ˆλ‹€.

* Make an instance managed and persistent.
   * @param entity  entity instance
   * @throws EntityExistsException if the entity already exists.
   * @throws IllegalArgumentException if the instance is not an
   *         entity
   * @throws TransactionRequiredException if there is no transaction when
   *         invoked on a container-managed entity manager of that is of type
   *         <code>PersistenceContextType.TRANSACTION</code>
   */
public void persist(Object entity);
  /**
   * Issue a single SQL execute, typically a DDL statement.
   * @param sql static SQL to execute
   * @throws DataAccessException if there is any problem
   */
  void execute(String sql) throws DataAccessException;
 

+ ν•˜μ§€λ§Œ λŸ°νƒ€μž„μ—λŸ¬λŠ” λͺ…μ‹œλ₯Ό 해놓지 μ•ŠμœΌλ©΄ μ–΄λ–€ μ˜ˆμ™Έκ°€ λ°œμƒν•  지 μ½”λ“œλ₯Ό μ½λŠ” 개발자 μž…μž₯μ—μ„œ 어렀움을 λŠλ‚„ 수 μžˆμŠ΅λ‹ˆλ‹€.

그럴 λ•Œμ— λ©”μ†Œλ“œμ—μ„œ λ°œμƒν•  수 μžˆλŠ” μ˜ˆμ™Έλ₯Ό λ¬Έμ„œλ‘œ λͺ…μ‹œν•΄ μ£Όκ±°λ‚˜ + μ½”λ“œμ—λ„ throws 둜 λͺ…μ‹œν•΄μ£ΌλŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

 

 

static class Repository {
    public void call() {
        try {
            runSQL();
            // catchλ¬Έμ—μ„œ 체크 -> 언체크(λŸ°νƒ€μž„) λ³€κ²½ν•΄μ„œ λ‚΄λ˜μ§€κΈ°
        } catch (SQLException e) {
            throw new RuntimeSQLException(e);
        }
    }

+ μ˜ˆμ™Έλ₯Ό μ „ν™˜ν•  λ•Œμ—λŠ” λ°˜λ“œμ‹œ κΈ°μ‘΄μ˜ˆμ™Έλ₯Ό ν¬ν•¨ν•΄μ„œ μŠ€νƒ 트레이슀λ₯Ό 남기도둝 ν•©μ‹œλ‹€. μŠ€νƒ 트레이슀λ₯Ό 남겨야 λ³€ν™˜λ˜κΈ° μ „μ˜ μ˜ˆμ™Έ(SQLException)λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€νƒ 트레이슀 둜그


<참고자료>

https://www.nextree.co.kr/p3239/

 

Java μ˜ˆμ™Έ(Exception) μ²˜λ¦¬μ— λŒ€ν•œ μž‘μ€ 생각

μΌμƒμƒν™œμ—μ„œλ„ 기본적인 것은 κ³ λ―Όν•˜μ§€ μ•Šκ³  μŠ΅κ΄€μ²˜λŸΌ μ‚¬μš©ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€. μ΄ˆκΈ‰ 개발자인 λ‚˜μ—κ²Œ ‘μ˜ˆμ™Έ(Exception)’이 λ°”λ‘œ 그런 κ²ƒμ΄μ—ˆλ‹€. 처음 JAVAμˆ˜μ—… λ•Œ κ°•μ‚¬λ‹˜κ»˜ "μ™œ λ‘œμ§μ„ try문으둜

www.nextree.co.kr

https://velog.io/@gillog/Java-Exception-Handling%EB%B3%B5%EA%B5%AC-%ED%9A%8C%ED%94%BC-%EC%A0%84%ED%99%98

 

[Java] Exception Handling(볡ꡬ, νšŒν”Ό, μ „ν™˜)

Exception Handling 졜근 Exception을 Handling ν•˜λ©΄μ„œ 세뢀적인 Handling 기법듀에 λŒ€ν•΄ κ³ μ‹¬ν•˜μ§€ μ•Šκ³ , Handling ν•˜λ‹€λ³΄λ‹ˆ λͺ…ν™•ν•œ 기쀀을 작으며 μ²˜λ¦¬ν•˜κΈ° νž˜λ“€μ—ˆλ‹€. 이번 gillogλ•Œ Exception Handling에 λŒ€ν•΄

velog.io

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard

 

μŠ€ν”„λ§ DB 1편 - 데이터 μ ‘κ·Ό 핡심 원리 - μΈν”„λŸ° | κ°•μ˜

λ°±μ—”λ“œ κ°œλ°œμ— ν•„μš”ν•œ DB 데이터 μ ‘κ·Ό κΈ°μˆ μ„ κΈ°μ΄ˆλΆ€ν„° μ΄ν•΄ν•˜κ³ , μ™„μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν”„λ§ DB μ ‘κ·Ό 기술의 원리와 ꡬ쑰λ₯Ό μ΄ν•΄ν•˜κ³ , 더 κΉŠμ΄μžˆλŠ” λ°±μ—”λ“œ 개발자둜 μ„±μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€., - κ°•μ˜

www.inflearn.com

 

λΈ”λ‘œκ·Έμ˜ 정보

Study Repository

rlaehddnd0422

ν™œλ™ν•˜κΈ°