# ์˜ˆ์™ธ์ฒ˜๋ฆฌ (Exception Handling)

written by sohyeon, hyemin ๐Ÿ’ก


# 1. ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜

ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ์–ด๋–ค ์›์ธ์— ์˜ํ•ด ์˜ค์ž‘๋™ํ•˜๊ฑฐ๋‚˜ ๋น„์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ
์ด๋Ÿฐ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•˜๋Š” ์›์ธ์„ ํ”„๋กœ๊ทธ๋žจ ์—๋Ÿฌ ๋˜๋Š” ์˜ค๋ฅ˜๋ผ๊ณ  ํ•œ๋‹ค.

๋ฐœ์ƒ์‹œ์ ์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘์ข…๋ฅ˜๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

  • ์ปดํŒŒ์ผ ์—๋Ÿฌ (compile error) : ์ปดํŒŒ์ผ ์‹œ์— ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ
  • ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ (runtime error) : ์‹คํ–‰ ์‹œ์— ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ
  • ๋…ผ๋ฆฌ์  ์—๋Ÿฌ (logical error) : ์‹คํ–‰์€ ๋˜์ง€๋งŒ ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ

์ž๋ฐ”์—์„œ๋Š” ์‹คํ–‰ ์‹œ์—(run time) ๋ฐœ์ƒํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ๋ถ„ํ•œ๋‹ค

  • ์—๋Ÿฌ(error): ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์ด๋‚˜ ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ(OutOfMemoryError, StackOverflowError)์™€ ๊ฐ™์ด ์ˆ˜์Šต๋  ์ˆ˜ ์—†๋Š” ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜
  • ์˜ˆ์™ธ(exception): ์ฝ”๋“œ์— ์˜ํ•ด ์ˆ˜์Šต๋  ์ˆ˜ ์žˆ๋Š” ๋‹ค์†Œ ๋ฏธ์•ฝํ•œ ์˜ค๋ฅ˜

ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด ๋†“์Œ์œผ๋กœ์จ ํ”„๋กœ๊ทธ๋žจ์˜ ๋น„์ •์ƒ์ ์ธ ์ข…๋ฃŒ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

# 2. ์˜ˆ์™ธ ํด๋ž˜์Šค์˜ ๊ณ„์ธต๊ตฌ์กฐ

๋ชจ๋“  ํด๋ž˜์Šค์˜ ์กฐ์ƒ์€ Objectํด๋ž˜์Šค ์ด๋ฏ€๋กœ Exception๊ณผ Errorํด๋ž˜์Šค ์—ญ์‹œ Objectํด๋ž˜์Šค์˜ ์ž์†๋“ค์ด๋‹ค.

                  Object
                    |
                Throwable
                  /  \
      Exception          Error
        / \               /  \
IOException RuntimeEx..  ..  OutOfMemoryError

๋ชจ๋“  ์˜ˆ์™ธ์˜ ์ตœ๊ณ  ์กฐ์ƒ์€ Exception class์ด๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Exception
    |
    |--- IOException
    |--- ClassNotFoundException
    |--- ...
    |--- RuntimeException
            |--- ArithmeticException
            |--- ClassCastException
            |--- NullPointerException
            |--- ...
            |--- IndexOutOfBoundsException

๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

  • Exception ํด๋ž˜์Šค๋“ค
    : ์‚ฌ์šฉ์ž์˜ ์‹ค์ˆ˜์™€ ๊ฐ™์€ ์™ธ์ ์ธ ์š”์ธ์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ
  • RuntimeException ํด๋ž˜์Šค๋“ค
    : ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์‹ค์ˆ˜๋กœ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ

# 3. ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•˜๊ธฐ

# 3-1. ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ž€?

- ์ •์˜: ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ์— ๋Œ€๋น„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ
- ๋ชฉ์ : ํ”„๋กœ๊ทธ๋žจ์˜ ๋น„์ •์ƒ ์ข…๋ฃŒ๋ฅผ ๋ง‰๊ณ  ์ •์ƒ์ ์ธ ์‹คํ–‰์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ

์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด try-catch๋ฌธ์„ ์‚ฌ์šฉํ•œ๋‹ค.

# ex) ์˜ˆ์ œ

class ExceptionEx1{
    public static void main(String args[]) {
        try {
            try{ } catch(Exception e){ }
        }catch (Exception e){
            try{ } catch(Exception e){ }  // --> error 'e' ๊ฐ€ ์ค‘๋ณต ์„ ์–ธ
        }
    }
}

# 3-2. ํŠน์ง•

  • try๋ธ”๋Ÿญ ๋˜๋Š” catch๋ธ”๋Ÿญ์— ๋˜ ๋‹ค๋ฅธ try-catch๋ฌธ์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค.
  • catch๋ธ”๋Ÿญ ๋‚ด์— ๋˜ ํ•˜๋‚˜์˜ try-catch๋ฌธ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, ๊ฐ™์€ ์ด๋ฆ„์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

# 4. try-catch๋ฌธ์˜ ํ๋ฆ„

  • try๋ธ”๋Ÿญ ๋‚ด์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ

    1. ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ์™€ ์ผ์น˜ํ•˜๋Š” catch๋ธ”๋Ÿญ์ด ์žˆ๋Š”์ง€ ํ™•์ธ

    2. ์ผ์น˜ํ•˜๋Š” catch๋ธ”๋Ÿญ์„ ์ฐพ๊ฒŒ๋˜๋ฉด, ๊ทธ catch๋ธ”๋Ÿญ ๋‚ด์˜ ๋ฌธ์žฅ๋“ค์„ ์ˆ˜ํ–‰ํ•˜๊ณ 
      ์ „์ฒด try-catch๋ฌธ์„ ๋น ์ ธ๋‚˜๊ฐ€์„œ ๊ทธ ๋‹ค์Œ ๋ฌธ์žฅ์„ ๊ณ„์†ํ•ด์„œ ์ˆ˜ํ–‰
      ๋งŒ์ผ ์ผ์น˜ํ•˜๋Š” catch๋ธ”๋Ÿญ์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด, ์˜ˆ์™ธ๋Š” ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ•œ๋‹ค.

  • try๋ธ”๋Ÿญ ๋‚ด์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

    1. catch๋ธ”๋Ÿญ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ „์ฒด try-catch๋ฌธ์„ ๋น ์ ธ๋‚˜๊ฐ€์„œ ์ˆ˜ํ–‰์„ ๊ณ„์†ํ•œ๋‹ค.

# 5. ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ๊ณผ catch๋ธ”๋Ÿญ

# 5-1. ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ๊ณผ ์ฒ˜๋ฆฌ

  • catch๋ธ”๋Ÿญ์€ ๊ด„ํ˜ธ()์™€ ๋ธ”๋Ÿญ{} ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ ์ ธ ์žˆ๋Š”๋ฐ,
    ๊ด„ํ˜ธ()๋‚ด์—๋Š” ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ์˜ˆ์™ธ์™€ ๊ฐ™์€ ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜ ํ•˜๋‚˜๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค.

  • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

  • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ฌธ์žฅ์ด try-catch๋ฌธ์˜ try๋ธ”๋Ÿญ์— ์žˆ๋‹ค๋ฉด, ์ด ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” catch๋ธ”๋Ÿญ์„ ์ฐพ๊ฒŒ๋œ๋‹ค.

  • ์ฒซ๋ฒˆ์งธ catch ๋ธ”๋Ÿญ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ catch๋ธ”๋Ÿญ์˜ ๊ด„ํ˜ธ()๋‚ด์— ์„ ์–ธ๋œ ์ฐธ์กฐ๋ณ€์ˆ˜์˜ ์ข…๋ฅ˜์™€ ์ƒ์„ฑ๋œ ์˜ˆ์™ธํด๋ž˜์Šค์˜ instance์— instanceof ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด ๊ฒ€์‚ฌํ•˜๊ณ  ๊ฒฐ๊ณผ๊ฐ€ true์ด๋ฉด ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ๋ชจ๋“  ์˜ˆ์™ธ ํด๋ž˜์Šค๋Š” Exceptionํด๋ž˜์Šค์˜ ์ž์†์ด๋ฏ€๋กœ Exceptionํด๋ž˜์Šค ํƒ€์ž…์˜ ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด ๋†“์œผ๋ฉด ์–ด๋–ค ์ข…๋ฅ˜์˜ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ด catch๋ธ”๋Ÿญ์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋œ๋‹ค.

# ex) ์˜ˆ์ œ

class ExceptionEx {
     public static void main(String args[]) {
         System.out.println(1);
         System.out.println(2);
         try {
             System.out.println(3);
             System.out.println(0/0); // 0์œผ๋กœ ๋‚˜๋ˆ  ArithmeticException๋ฐœ์ƒ
             System.out.println(4);  // ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค
         }catch (ArithmeticException ae){
             if (ae instanceof ArithmeticException)
                System.out.println("true");
             System.out.println("ArithmeticException");
         }catch (Exception e){  //ArithmeticException์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์˜ˆ์™ธ
             System.out.println("Exception");
         }
         System.out.println(6);
     }
 }

# ์‹คํ–‰๊ฒฐ๊ณผ

1
2
3
true
ArithmeticException
6

# 5-2. ์˜ˆ์™ธ์— ๋Œ€ํ•œ method

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ƒ์„ฑ๋˜๋Š” ์˜ˆ์™ธํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—๋Š” ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์ ธ ์žˆ์œผ๋ฉฐ
๋‹ค์Œ method๋“ค์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

- printStackTrace(): ์˜ˆ์™ธ๋ฐœ์ƒ ๋‹น์‹œ์˜ ํ˜ธ์ถœ์Šคํƒ์— ์žˆ์—ˆ๋˜ ๋ฉ”์„œ๋“œ์˜ ์ •๋ณด์™€ ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅ  
- getMessage(): ๋ฐœ์ƒํ•œ ์˜ˆ์™ธํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ์ €์žฅ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.  

# 5-3. ๋ฉ€ํ‹ฐ catch๋ธ”๋Ÿญ

JDK1.7๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ catch๋ธ”๋Ÿญ์„ '|' ๊ธฐํ˜ธ๋ฅผ ์ด์šฉํ•ด์„œ ํ•˜๋‚˜์˜ catch๋ธ”๋Ÿญ์œผ๋กœ ํ•ฉ์น  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๊ณ  ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ ํด๋ž˜์Šค์˜ ๊ฐœ์ˆ˜์— ์ œํ•œ์ด ์—†๋‹ค.

๋‘ ์˜ˆ์™ธ ํด๋ž˜์Šค๊ฐ€ ์กฐ์ƒ๊ณผ ์ž์† ๊ด€๊ณ„๋ผ๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
์กฐ์ƒํด๋ž˜์Šค๋งŒ ์จ์ฃผ๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๋ผ๋Š” ์˜๋ฏธ์˜ ์—๋Ÿฌ๋‹ค.

# ex) ์ ์šฉ ์ „

try {
    ...
}catch (ExceptionA e){
    e.printStackTrace();
}catch (ExceptionB e2){
    e2.printStackTrace();
}

# ex) ์ ์šฉ ํ›„

try {
    ...
}catch (ExceptionA | ExceptionB e){
    e.printStackTrace();
}

# 6. finally๋ธ”๋Ÿญ

finally๋ธ”๋Ÿญ์€ try-catch๋ฌธ๊ณผ ํ•จ๊ป˜ ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ์—ฌ๋ถ€์— ์ƒ๊ด€์—†์ด ์‹คํ–‰๋˜์–ด์•ผํ•  ์ฝ”๋“œ๋ฅผ ํฌํ•จ์‹œํ‚ฌ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. try-catch๋ฌธ ๋์— ์„ ํƒ์ ์œผ๋กœ ๋ง๋ถ™์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

# ex) ์˜ˆ์ œ

try {
    // ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ฌธ์žฅ๋“ค์„ ๋„ฃ๋Š”๋‹ค.
    ...
} catch (Exception e) {
    // ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฌธ์žฅ์„ ์ ๋Š”๋‹ค.
    ...
} finally {
    // ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ์ˆ˜ํ–‰๋˜์–ด์•ผํ•˜๋Š” ๋ฌธ์žฅ๋“ค์„ ๋„ฃ๋Š”๋‹ค.
}

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์—๋Š” try->catch->finally์ˆœ์œผ๋กœ ์‹คํ–‰๋˜๊ณ ,
์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ try->finally์ˆœ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

Last Updated: 12/5/2020, 11:36:44 AM