[Java] μ˜ˆμ™Έμ²˜λ¦¬

CountryGirlΒ·2023λ…„ 6μ›” 14일
0

Java

λͺ©λ‘ 보기
17/18
post-thumbnail

아무리 μž˜ν•˜κ³  쒋은 ν”„λ‘œκ·Έλž˜λ¨ΈλΌλ„ λͺ¨λ“  것이 μ™„λ²½ν•  μˆ˜λŠ” μ—†λ‹€.
μ™„λ²½ν•œ ν”„λ‘œκ·Έλž¨λ„ μ œμ–΄ν•  수 μ—†λŠ” λ¬Έμ œκ°€ λ°œμƒλ˜κ³ , μ‚¬μš©μžμ˜ μž…λ ₯에 따라 λ¬Έμ œκ°€ λ°œμƒμ΄ 될 수 μžˆλ‹€.

[μ£Όλ‹ˆμ–΄κ°œλ°œμž ν˜Ήμ€ 개발자λ₯Ό 꿈 κΎΈλŠ” μ‚¬λžŒ]
"κ΅¬ν˜„"에 μ΄ˆμ μ„ 두고 μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€. "λŒμ•„κ°€κΈ°λ§Œ ν•˜λ©΄ λ˜μ§€!"λΌλŠ” 생각을 가지고..
ν•˜μ§€λ§Œ κ³„μ†ν•΄μ„œ 이런 생각을 ν•œλ‹€λ©΄ 이것은 λ‚˜μ€‘μ— μŠ΅κ΄€μ΄ 되고 쒋은 개발자둜 μ„±μž₯ν•  수 없을 것이닀 !


πŸ“Œ 였λ₯˜ vs μ˜ˆμ™Έ

였λ₯˜μ™€ μ˜ˆμ™Έλ₯Ό ꡬ뢄 μ§“λŠ” 일반적인 기쀀은 "회볡 κ°€λŠ₯ μ—¬λΆ€" 이닀.

였λ₯˜ (Error)

  • 일반적으둜 회볡이 λΆˆκ°€λŠ₯ν•œ λ¬Έμ œμ΄λ‹€.
  • μ‹œμŠ€ν…œ λ ˆλ²¨μ—μ„œ, λ˜λŠ” 주둜 ν™˜κ²½μ μΈ 이유둜 λ°œμƒν•œλ‹€.
  • μ—λŸ¬κ°€ λ°œμƒν•œ 경우 μ–΄λ– ν•œ 였λ₯˜λ‘œ 인해 ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κ³  λŒ€μ‘ν•˜μ—¬μ•Ό ν•œλ‹€.

μ˜ˆμ™Έ (Exception)

  • 일반적으둜 회볡이 κ°€λŠ₯ν•œ λ¬Έμ œμ΄λ‹€.
  • 회볡이 κ°€λŠ₯ν•˜λ‹€λŠ” 것은 κ·Έ μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλ‹€λŠ” 것을 미리 인지(μ˜ˆμƒ)ν•˜κ³  λŒ€μ‘μ„ ν•œλ‹€λŠ” 것이닀.

πŸ“Œ μ˜ˆμ™Έ

  • 컴파일 μ—λŸ¬ (μ˜ˆμ™Έ)
    .java νŒŒμΌμ„ .class 파일둜 μ»΄νŒŒμΌν•  λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬.
    λŒ€λΆ€λΆ„ 문법이 ν‹€λ €μ„œ λ°œμƒν•˜κ³  ν•΄κ²°ν•  수 μžˆλŠ” λŒ€μ‘μ€ 문법에 맞게 λ‹€μ‹œ μž‘μ„±ν•˜λŠ” 것이닀.

  • λŸ°νƒ€μž„ μ—λŸ¬ (μ˜ˆμ™Έ)
    μ»΄νŒŒμΌμ€ 잘 λ˜μ—ˆμ§€λ§Œ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 도쀑 λ°œμƒν•˜λŠ” μ—λŸ¬.
    (μ˜ˆμ‹œ)
    DBκ°€ λ“€μ–΄μ™”λŠ”λ° ν—ˆμš©ν•  수 μ—†λŠ” dataκ°€ 듀어왔을 λ•Œ

😎 μ˜ˆμ™Έμ˜ μ’…λ₯˜

Checked Exception

: 이미 μΈμ§€ν•˜κ³  μžˆλŠ” νŠΉμ • 문제

  • 컴파일 μ‹œμ μ— ν™•μΈν•˜λŠ” μ˜ˆμ™Έ
  • λ°˜λ“œμ‹œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ£Όμ–΄μ•Όν•œλ‹€.

Unchecked Exception

: 미리 μ•Œ 수 μ—†λŠ”, μ˜ˆμΈ‘ν•  수 μ—†λŠ” 문제

  • λŸ°νƒ€μž„ μ‹œμ μ— ν™•μΈλ˜λŠ” μ˜ˆμ™Έ
  • μ˜ˆμ™Έμ²˜λ¦¬κ°€ λ°˜λ“œμ‹œ ν•„μš”ν•˜μ§€λŠ” μ•Šλ‹€.

🚨 μ—λŸ¬ (Error) β‰  μ˜ˆμ™Έ (Exception) 🚨


πŸ“Œ μ˜ˆμ™Έ λ°œμƒ (try - catch, finally)

μ˜ˆμ™Έ μ •μ˜ - μ–΄λ–€ μ’…λ₯˜μ˜ μ˜ˆμ™Έλ“€μ΄ ν”„λ‘œμ νŠΈ μ•ˆμ— μ‘΄μž¬ν•˜κ³  μ–΄λ–»κ²Œ λΆ„λ₯˜ν•΄μ„œ μ •μ˜ν• κΉŒ?
μ˜ˆμ™Έ λ°œμƒ μ•Œλ¦¬κΈ° - μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλŠ” logic 에 flag λ₯Ό λ‹¬μ•„λ†“λŠ”λ‹€.
μ˜ˆμ™Έ 핸듀링 - μ–΄λ–€ μ˜ˆμ™Έ μ‚¬ν•­λ§ˆλ‹€ μ–΄λ–€ 처리λ₯Ό ν• κΉŒ

일단 try (츄라이) ν•΄ ~~~ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ κ·Έκ±Έ μž‘μ•„ (catch). 그리고 μ •μƒμ μœΌλ‘œ μˆ˜ν–‰λ˜λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ“  μˆ˜ν–‰λ˜μ–΄μ•Ό ν•˜λŠ” logic 을 μˆ˜ν–‰ν•΄ (finally)

// μ˜ˆμ™Έ μ •μ˜
class OurBadException extends Exception {	
	public OurBadException() {
		super("μœ„ν—˜ν•œ 행동을 ν•˜λ©΄ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό κΌ­ ν•΄μ•Όν•©λ‹ˆλ‹€!");
	}
}
------------------------------------------------------------------------
// μ˜ˆμ™Έ λ°œμƒ μ•Œλ¦¬κΈ°
class OurClass {
    private final Boolean just = true;
    
    public void thisMethodIsDangerous() throws OurBadException {	 // #1
        if (just) {
            throw new OurBadException();		// #2
        }
    }
}
------------------------------------------------------------------------
// μ˜ˆμ™Έ 핸듀링
public class StudyException {
    public static void main(String[] args) {
        OurClass ourClass = new OurClass();

        try {
            System.out.println("try λ¬Έ μ‹€ν–‰ #1");
            ourClass.thisMethodIsDangerous();
            System.out.println("try λ¬Έ μ‹€ν–‰ #2");		// #3
        } catch (OurBadException e) {				 // #4
            System.out.println(e.getMessage());
            System.out.println("catch λ¬Έ μ‹€ν–‰");
        } finally {
            System.out.println("μš°λ¦¬λŠ” 방금 μ˜ˆμ™Έλ₯Ό handling ν–ˆμŠ΅λ‹ˆλ‹€. 
            							μ •μƒμ²˜λ¦¬λ˜λ“ , μ˜ˆμ™Έμ‚¬ν•­μ΄ λ°œμƒν•˜λ“  μ—¬κΈ°λ₯Ό κ±°μ³μš”!!");
        }
    }
}
------------------------------------------------------------------------
/*
OUTPUT
try λ¬Έ μ‹€ν–‰ #1
μœ„ν—˜ν•œ 행동을 ν•˜λ©΄ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό κΌ­ ν•΄μ•Όν•©λ‹ˆλ‹€!
catch λ¬Έ μ‹€ν–‰
μš°λ¦¬λŠ” 방금 μ˜ˆμ™Έλ₯Ό handling ν–ˆμŠ΅λ‹ˆλ‹€. μ •μƒμ²˜λ¦¬λ˜λ“ , μ˜ˆμ™Έμ‚¬ν•­μ΄ λ°œμƒν•˜λ“  μ—¬κΈ°λ₯Ό κ±°μ³μš”!!
*/
  • #1
    thisMethodIsDangerous() 뒀에 throws OurBadException 을 λΆ™μ—¬ thisMethodIsDangerous() κ°€ μœ„ν—˜ν•œ λ©”μ„œλ“œλΌλŠ” 것을 μ•Œλ €μ€€λ‹€. (flag λ₯Ό 달아쀀닀.)

  • #2
    μƒˆλ‘œμš΄ OurBadException을 λ§Œλ“€μ–΄μ„œ λ˜μ§„λ‹€.
    ➑️ μ΄λ ‡κ²Œ ν•  수 μžˆλŠ” 이유: 이미 thisMethodIsDangerous() κ°€ μœ„ν—˜ν•˜λ‹€κ³  flagλ₯Ό λ‹¬μ•„μ€˜μ„œ

  • #3
    ourClass.thisMethodIsDangerous(); 을 λ§Œλ‚˜λ©΄ 더 이상 try λ₯Ό μ‹€ν–‰ν•˜μ§€ μ•Šμ•„ try λ¬Έ μ‹€ν–‰ #1 만 좜λ ₯λœλ‹€.

  • #4
    μ†Œκ΄„ν˜Έ catch() : 무슨 μ’…λ₯˜μ˜ μ˜ˆμ™Έ 사항을 catch ν•  것인지 λͺ…μ‹œ.

throws / throw

throws

  • λ©”μ„œλ“œ 이름 뒀에 λΆ™μ—¬ 이 λ©”μ„œλ“œκ°€ μ–΄λ–€ μ˜ˆμ™Έμ‚¬ν•­μ„ 던질 수 μžˆλŠ”μ§€ μ•Œλ €μ£ΌλŠ” μ˜ˆμ•½μ–΄
  • μ—¬λŸ¬ μ’…λ₯˜μ˜ μ˜ˆμ™Έμ‚¬ν•­μ„ 적을 수 μžˆλ‹€.

throw

  • λ©”μ„œλ“œ μ•ˆμ—μ„œ μ‹€μ œλ‘œ μ˜ˆμ™Έ 객체λ₯Ό 던질 λ•Œ μ‚¬μš©ν•˜λŠ” μ˜ˆμ•½μ–΄
  • λ˜μ§€λŠ” μ˜ˆμ™Έ 객체 ν•˜λ‚˜μ™€ 같이 μ¨μ•Όν•œλ‹€.
  • return 처럼 throw μ•„λž˜ ꡬ문은 μ‹€ν–‰λ˜μ§€ μ•Šκ³  λ©”μ„œλ“œκ°€ μ’…λ£Œλœλ‹€.

🚨 ourClass.thisMethodIsDangerous(); λ₯Ό λ°”λ‘œ ν˜ΈμΆœν•  수 μ—†μ–΄. μ™œλƒν•˜λ©΄ 이미 μœ„ν—˜ν•˜λ‹€κ³  flagλ₯Ό λ‹¬μ•„λ†”μ„œ 무쑰건 μ˜ˆμ™Έμ²˜λ¦¬ (try-catch) λ₯Ό ν•΄μ•Όν•΄. 🚨


πŸ“Œ Chained Exception

: μ—°κ²°λœ μ˜ˆμ™Έ

  • μ˜ˆμ™ΈλŠ” 또 λ‹€λ₯Έ μ˜ˆμ™Έλ₯Ό μœ λ°œν•  수 μžˆλ‹€.
    μ˜ˆμ™Έ Aκ°€ μ˜ˆμ™ΈBλ₯Ό λ°œμƒμ‹œμΌ°λ‹€λ©΄, AλŠ” B의 원인 μ˜ˆμ™Έμ΄λ‹€.

μ˜ˆμ™Έ μ—°κ²°

: 원인 μ˜ˆμ™Έλ₯Ό μƒˆλ‘œμš΄ μ˜ˆμ™Έμ— λ“±λ‘ν•œ ν›„ λ‹€μ‹œ μƒˆλ‘œμš΄ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” 것

  • initCause() : μ˜ˆμ™Έμ—°κ²°. μ§€μ •ν•œ μ˜ˆμ™Έλ₯Ό 원인 μ˜ˆμ™Έλ‘œ λ“±λ‘ν•˜λŠ” λ©”μ„œλ“œ
  • getCause() : 원인 에외λ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ„œλ“œ

Q. μ™œ μ˜ˆμ™Έλ₯Ό μ—°κ²°ν• κΉŒ?

A. μ—¬λŸ¬κ°€μ§€ μ˜ˆμ™Έ 사항듀이 μ‘΄μž¬ν•  수 μžˆλ‹€(원인이 ν•˜λ‚˜κ°€ μ•„λ‹ˆλΌ μ—¬λŸ¬ 개일 수 μžˆλ‹€). ➑️ ν•˜λ‚˜λ‘œ λ¬Άμ–΄μ„œ ν•œ λ²ˆμ— ν•œ λΆ„λ₯˜λ‘œ μ²˜λ¦¬ν•  수 μžˆλ„λ‘. μ½”λ“œλ₯Ό 쀄이기 μœ„ν•΄ Checked Exception을 Unchecked Exception으둜 포μž₯(wrapping) ν•˜κΈ°λ„ ν•œλ‹€.

profile
πŸ’»πŸŒΎμ‹œκ³¨μ†Œλ…€μ˜ 엉망징창 개발 μ„±μž₯μΌμ§€πŸŒΎπŸ’» (2023.05.23 ~)

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보