Language/Java

โ˜• ์ž๋ฐ” ์˜ˆ์™ธ ๋˜์ง€๊ธฐ(throw) & ์˜ˆ์™ธ ์—ฐ๊ฒฐ(Chained Exception)

์ธํŒŒ_ 2022. 11. 24. 12:00

java-error-exception

์˜ˆ์™ธ ๋˜์ง€๊ธฐ

 

์˜ˆ์™ธ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ (throw)

๋งŒ์ผ ํ”„๋กœ๊ทธ๋žจ์ ์œผ๋กœ ์—๋Ÿฌ๊ฐ€ ์•„๋‹ˆ๋ผ๋„ ๋กœ์ง์ƒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ๋ถ€๋Ÿฌ ์—๋Ÿฌ๋ฅผ ๋‚ด์„œ ๋กœ๊ทธ์— ๊ธฐ๋กํ•˜๊ณ  ์‹ถ์€ ์ƒํ™ฉ์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ”์—์„œ๋Š” throw ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ•์ œ๋กœ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์›๋ž˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์•Œ์•„์„œ ์—๋Ÿฌ๋ฅผ ํƒ์ง€ํ•˜๊ณ  ์ฒ˜๋ฆฌ ํ•˜์˜€์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ผ๋ถ€๋Ÿฌ ์—๋Ÿฌ๋ฅผ throwํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ catch ํ•œ๋‹ค๋Š” ๊ฐœ๋…์œผ๋กœ ๋ณด๋ฉด ๋œ๋‹ค.

์ด๋•Œ new ์ƒ์„ฑ์ž๋กœ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ๋˜์ ธ๋Š”๋ฐ, ์ด ํด๋ž˜์Šค ์ƒ์„ฑ์ž์— ์ž…๋ ฅ๊ฐ’์„ ์ฃผ๊ฒŒ๋˜๋ฉด, catch๋ฌธ์˜ getMessage() ๋ฉ”์„œ๋“œ์—์„œ ์ถœ๋ ฅํ•  ๋ฉ”์„ธ์ง€๋ฅผ ์ง€์ •ํ•˜๊ฒŒ ๋œ๋‹ค.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        try {
            Scanner s = new Scanner(System.in);
            System.out.print("์Œ์ˆ˜๋ฅผ ์ œ์™ธํ•œ ์ˆซ์ž๋งŒ ์ž…๋ ฅํ•˜์„ธ์š” : ");
            int num = s.nextInt(); // ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ •์ˆ˜๋ฅผ ์ž…๋ ฅ ๋ฐ›์Œ
            if (num < 0) {
                // ๋งŒ์ผ ์‚ฌ์šฉ์ž๊ฐ€ ๋ง์„ ์•ˆ๋“ฃ๊ณ  ์Œ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ฐ•์ œ๋กœ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ์ผœ๋ฒ„๋ฆฌ๊ธฐ!!
                throw new ArithmeticException("์™œ ํ•˜์ง€๋ง๋ผ๋Š” ์ง“์„ ํ•˜์‹œ๋Š” ๊ฑฐ์ฃ ? ใ…กใ…ก"); // ArithmeticException ์˜ˆ์™ธ ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด catch๋ฌธ์œผ๋กœ ๋„˜๊ฒจ๋ฒ„๋ฆฐ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๋œ๋‹ค
            }
            System.out.println("์Œ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ์…จ๊ตฐ์š”. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค");
        } catch (ArithmeticException e) {
            System.out.println(e.getMessage());
        } finally {
            System.out.println("ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค");
        }
    }
}

java-throw
java-throw


์˜ˆ์™ธ ๋– ๋„˜๊ธฐ๊ธฐ (throws)

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ try - catch ๋ธ”๋ก์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ด์ง€๋งŒ, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” ๋‹ค๋ฅธ ๊ณณ์—์„œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ๋– ๋„˜๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค.

์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ throws์ด๋‹ค. throws ๋Š” ๋ฉ”์†Œ๋“œ ์„ ์–ธ๋ถ€ ๋์— ์ž‘์„ฑ๋˜์–ด ๋ฉ”์†Œ๋“œ์—์„œ ์˜ˆ์™ธ๋ฅผ ์ง์ ‘ ์ฒ˜๋ฆฌ(catch)ํ•˜์ง€ ์•Š์€ ์˜ˆ์™ธ๋ฅผ ํ˜ธ์ถœํ•œ ๊ณณ์œผ๋กœ ๋– ๋„˜๊ธฐ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ‚ค์›Œ๋“œ๋Š” throw ๊ณ  ์˜ˆ์™ธ๋ฅผ ๋ฉ”์„œ๋“œ์— ์„ ์–ธํ•˜๋Š” ํ‚ค์›Œ๋“œ๋Š” throws ์ด๋‹ค.

 

์˜ˆ๋ฅผ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ”์„œ๋“œ 3๊ฐœ๊ฐ€ ์žˆ๊ณ  ๊ฐ ๋ฉ”์„œ๋“œ ๋งˆ๋‹ค ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด try - catch ๋ธ”๋ก์œผ๋กœ ์ผ์ผํžˆ ๊ฐ์‹ธ์ฃผ์—ˆ๋‹ค.

public class Main {
    public static void main(String[] args) {
        method1();
        method2();
        method3();
    }

    public static void method1() {
        try {
            throw new ClassNotFoundException("์—๋Ÿฌ์ด์ง€๋กฑ");
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
        }
    }

    public static void method2() {
        try {
            throw new ArithmeticException("์—๋Ÿฌ์ด์ง€๋กฑ");
        } catch (ArithmeticException e) {
            System.out.println(e.getMessage());
        }
    }

    public static void method3() {
        try {
            throw new NullPointerException("์—๋Ÿฌ์ด์ง€๋กฑ");
        } catch (NullPointerException e) {
            System.out.println(e.getMessage());
        }
    }
}

ํ•˜์ง€๋งŒ ๊ดœํžˆ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ๊ฐ€๋…์„ฑ๋„ ๊ทธ๋ ‡๊ฒŒ ์ข‹์ง€๊ฐ€ ์•Š์•„ ๋ณด์ธ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ”์„œ๋“œ ์„ ์–ธ ์ฝ”๋“œ ์˜ค๋ฅธ์ชฝ์— throws ์˜ˆ์™ธํด๋ž˜์Šค๋ช… ์„ ๊ธฐ์žฌํ•ด์ฃผ๋ฉด, ๋งŒ์ผ ํ•ด๋‹น ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ try - catch ๋ฌธ์ด ์—†์œผ๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ์ƒ์œ„ ์Šคํƒ ๋ฉ”์„œ๋“œ๋กœ ๊ฐ€์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค.

void method() throws Exception, Exception2, ... {	
    ์—๋Ÿฌ๋ฐœ์ƒ์ฝ”๋“œ; // ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜„ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ์ชฝ์œผ๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค.
}
public class Main {
    public static void main(String[] args) {
        try {
            method1();
            method2();
            method3();
        } catch (ClassNotFoundException | ArithmeticException | NullPointerException e) {
            System.out.println(e.getMessage());
        }
    }

    public static void method1() throws ClassNotFoundException {
        throw new ClassNotFoundException("์—๋Ÿฌ์ด์ง€๋กฑ");
    }

    public static void method2() throws ArithmeticException {
        throw new ArithmeticException("์—๋Ÿฌ์ด์ง€๋กฑ");
    }

    public static void method3() throws NullPointerException {
        throw new NullPointerException("์—๋Ÿฌ์ด์ง€๋กฑ");
    }
}

java-throws

์ฆ‰, ์˜ˆ์™ธํด๋ž˜์Šค๋ฅผ ๋ฉ”์„œ๋“œ์˜ throws์— ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์€ ์ด๊ณณ์—์„œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์—๊ฒŒ ์˜ˆ์™ธ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๋– ๋งก๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ ์˜ˆ์™ธ๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋˜๋‹ค์‹œ ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์—๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ณ„์† ํ˜ธ์ถœ ์Šคํƒ์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ๋”ฐ๋ผ ์ „๋‹ฌ๋˜๋‹ค๊ฐ€, ์ œ์ผ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” main ๋ฉ”์†Œ๋“œ์—์„œ throws๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€์ƒ๋จธ์‹ ์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค.


์˜ˆ์™ธ ๋ฐœ์ƒ๊ณผ ์ฝ”๋“œ์˜ ํŠธ๋žœ์žญ์…˜

ํŠธ๋žœ์žญ์…˜(Transaction)์€ ํ•˜๋‚˜์˜ ์ž‘์—… ๋‹จ์œ„๋ฅผ ๋œปํ•œ๋‹ค.

์ฆ‰, ์ž๋ฐ” ์ฝ”๋“œ์—์„œ ๋ฉ”์„œ๋“œ ๋ธ”๋Ÿญ๋‚ด์˜ ์ฝ”๋“œ๋“ค์ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๋ชจ๋‘ ์‹คํ–‰๋˜๋Š๋ƒ ์•„๋‹ˆ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ์ƒํƒœ๋กœ ์ค‘์ง€ํ•˜๋Š๋ƒ์˜ ์ž‘์—… ๋‹จ์œ„๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์–ด๋–ค ํ˜•ํƒœ์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค. 

์˜ˆ๋ฅผ๋“ค์–ด ๊ฐ ๋ฉ”์„œ๋“œ์—์„œ ์ผ์ผํžˆ try - catch ํ•˜๋ฉด, ๋ฉ”์ธ ๋ฉ”์†Œ๋“œ์— ์žˆ๋Š” ๋ฉ”์„œ๋“œ ์‹คํ–‰ ์ฝ”๋“œ ๋ถ€๋ถ„์€ 3๊ฐœ ๋ชจ๋‘ ์‹คํ–‰ ์ž์ฒด๋Š” ๋œ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ ๋ฉ”์„œ๋“œ์—์„œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์œ„์˜ ๋ฉ”์ธ ๋ฉ”์„œ๋“œ์˜ ์ฝ”๋“œ๋“ค์€ ๋ชจ๋‘ ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค.

java-throws

 

๋ฐ˜๋ฉด์— throws๋ฅผ ํ†ตํ•ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์ƒ์œ„ ๋ฉ”์„œ๋“œ์—์„œ ๋ชจ์•„ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค๋ฉด, ์ฝ”๋“œ ์–ด๋Š ํ•œ๊ณณ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ ๋’ค์˜ ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋“ค์€ ๋‹น์—ฐํžˆ ์‹คํ–‰๋˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. (๋ฐ”๋กœ catch๋กœ ์ ํ”„ํ•˜๋‹ˆ๊นŒ)

java-throws

์ด์ฒ˜๋Ÿผ try - catch ๋ฌธ์€ ์–ด๋””์— ์‚ฌ์šฉํ•˜๋ƒ ์–ด๋””์„œ throws ํ•˜๋Š๋ƒ์— ๋”ฐ๋ผ ์ž๋ฐ” ์ฝ”๋“œ์˜ ์ž‘์—… ๋‹จ์œ„(ํŠธ๋žœ์žญ์…˜)๊ฐ€ ์™„์ „ํžˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์งœ ์ฃผ์–ด์•ผ ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ€์•ผ ํ•œ๋‹ค. 


์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ (Chained Exception)

 

์˜ˆ์™ธ๋ฅผ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋กœ ๊ฐ์‹ธ ๋˜์ง€๊ธฐ

์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ(chained exception)๋Š” ํ•œ ์˜ˆ์™ธ๊ฐ€ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ ๋‹คํ˜•์„ฑ์„ ์ด์šฉํ•˜์—ฌ ๋ถ€๋ชจ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ๋‹ค๋ค„์˜จ ๊ฒƒ ์ฒ˜๋Ÿผ, ์˜ˆ์™ธ๋„ ๋งˆ์น˜ ๋ถ€๋ชจ ์˜ˆ์™ธ๋กœ ๊ฐ์‹ธ์„œ ๋ณด๋‚ด ๋งˆ์น˜ ์˜ˆ์™ธ์˜ ๋‹คํ˜•์„ฑ ์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์˜ˆ์™ธ A๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด ์ด๋ฅผ ์˜ˆ์™ธ B๋กœ ๊ฐ์‹ธ์„œ throwํ•˜๋Š” ์‹์œผ๋กœ, ๋งˆ์น˜ ์˜ˆ์™ธ๋ฅผ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋กœ ๊ฐ์‹ธ์„œ ๋˜์ง„๋‹ค๊ณ  ๋ณด๋ฉด๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ˆ์™ธ A๊ฐ€ ์˜ˆ์™ธ B๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ๋‹ค๋ฉด, A๋ฅผ B์˜ '์›์ธ ์˜ˆ์™ธ(cause exception)'๋ผ๊ณ  ํ•œ๋‹ค.

 

Exception ํด๋ž˜์Šค๊ฐ€ ์ƒ์†ํ•˜๊ณ  ์žˆ๋Š” Throwable ํด๋ž˜์Šค์—๋Š” getMessage() ์™€ printStackTrace() ์ด์™ธ์—๋„ chained exception์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋‹ค์Œ ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค.

  • Throwable initCause (Throwable cause) : ์ง€์ •ํ•œ ์˜ˆ์™ธ๋ฅผ ์›์ธ ์˜ˆ์™ธ๋กœ ๋“ฑ๋ก
  • Throwable getCause() : ์›์ธ ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜

์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์˜ˆ์™ธ๋ฅผ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋กœ ํฌ์žฅํ•ด ๋˜์งˆ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๋‹น์—ฐํžˆ Exception ํด๋ž˜์Šค์˜ ๋ถ€๋ชจ์ธ Throwable ํด๋ž˜์Šค์— ์ •์˜๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์˜ˆ์™ธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋‹ค์Œ ์•„๋ž˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

class InstallException extends Exception { ... }
class SpaceException extends Exception { ... }
class MemoryException extends Exception { ... }

public class Main {
    public static void main(String[] args) {
        try {
            install();
        } catch (InstallException e) {
            System.out.println("์›์ธ ์˜ˆ์™ธ : " + e.getCause()); // ์›์ธ ์˜ˆ์™ธ ์ถœ๋ ฅ
            e.printStackTrace();
        }
    }

    public static void install() throws InstallException {
        try {
            throw new SpaceException("์„ค์น˜ํ•  ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค."); // SpaceException ๋ฐœ์ƒ

        } catch (SpaceException e) {
            InstallException ie = new InstallException("์„ค์น˜์ค‘ ์˜ˆ์™ธ๋ฐœ์ƒ"); // ์˜ˆ์™ธ ์ƒ์„ฑ
            ie.initCause(e); // InstallException์˜ ์›์ธ ์˜ˆ์™ธ๋ฅผ SpaceException์œผ๋กœ ์ง€์ •
            throw ie; // InstallException์„ ๋ฐœ์ƒ์‹œ์ผœ ์ƒ์œ„ ๋ฉ”์„œ๋“œ๋กœ throws ๋œ๋‹ค.
        } catch (MemoryException e) {
            // ...
        }
    }
}
  1. startInstall() ๋ฉ”์„œ๋“œ์—์„œ SpaceException ์ด๋ผ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ
  2. catch ๋ฌธ์—์„œ InstallExceptoin ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑ
  3. ๊ทธ๋ฆฌ๊ณ  InstallException ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ initCause()๋ฅผ ์ด์šฉํ•ด SpaceException ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด ์‹คํ–‰
  4. ๊ทธ๋Ÿฌ๋ฉด SpaceException ์˜ˆ์™ธ๋Š” InstallException ์˜ˆ์™ธ์— ํฌํ•จ๋˜๊ฒŒ ๋œ๋‹ค. (์›์ธ ์˜ˆ์™ธ)
  5. InstallException ์˜ˆ์™ธ ๊ฐ์ฒด๋ฅผ ๋ฐ–์œผ๋กœ throws ํ•œ๋‹ค.
  6. ๋ฉ”์ธ๋ฉ”์„œ๋“œ์—์„œ InstallException ์˜ˆ์™ธ๋ฅผ catchํ•˜๊ณ  getCause() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์›์ธ ์˜ˆ์™ธ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค

java-chained exception

๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ๊ทธ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋  ๊ฒƒ์„, ์™œ ๊ตณ์ด ์›์ธ ์˜ˆ์™ธ๋กœ ํฌ์žฅํ•ด์„œ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋กœ ๋˜์ง€๋Š” ์ด์œ ๋Š”, ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์˜ˆ์™ธ๋ฅผ ํ•˜๋‚˜์˜ ํฐ ๋ถ„๋ฅ˜์˜ ์˜ˆ์™ธ๋กœ ๋ฌถ์–ด์„œ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ ๋‹คํ˜•์„ฑ ์˜ˆ์™ธ ๋ฒ„์ „์ด๋ผ๊ณ  ๋ด๋„ ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฒ˜์Œ ๋ถ€ํ„ฐ ๋ช…ํ™•ํ•œ ์—๋Ÿฌ ์ •๋ณด๋ฅผ ์ฃผ๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ๋‹จ๊ณ„๋ณ„๋กœ ์–ด๋– ํ•œ ์›์ธ์˜ ์—๋Ÿฌ์— ์˜ํ•ด์„œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค๋Š” ์ •๋ณด๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด ๋” ์ข‹๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ์‚ฌ์ง„ ์ฒ˜๋Ÿผ, ๋‹จ์ˆœํžˆ '์„ค์น˜ํ•  ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.'  ๋ผ๋Š” ์—๋Ÿฌ๋งŒ ๋„์šฐ๋ฉด ์–ด๋– ํ•œ ์›์ธ ๋™์ž‘์œผ๋กœ ์ธํ•ด ๊ฐ‘์ž๊ธฐ ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•˜๋Š”์ง€ ์ถ”์ ์„ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์˜ˆ์™ธ๋ฅผ ๊ฐ์‹ธ์„œ '์„ค์น˜์ค‘์— → ์„ค์น˜ํ•  ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•ด ์˜ˆ์™ธ ๋ฐœ์ƒ' ์ด๋Ÿฐ์‹์œผ๋กœ ์ถ”์ ์ด ์šฉ์ดํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


Checked ์˜ˆ์™ธ๋ฅผ Unchecked ์˜ˆ์™ธ๋กœ ๋ณ€ํ™˜

์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ(chained exception)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ ๋Š” checked์˜ˆ์™ธ๋ฅผ unchecked์˜ˆ์™ธ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด checked exception์˜ ์ข…๋ฅ˜์˜ ์˜ˆ์™ธ๋ฅผ ํฌํ•จํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ(try - catch)๋ฅผ ๊ฐ•์ œํ•œ๋‹ค.

๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋กœ FileWriter ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ try - catch๋กœ ๊ฐ์‹ธ์ฃผ์–ด์•ผ ์ปดํŒŒ์ผ์ด ๋œ๋‹ค.

java-chained exception

์ด๋Ÿฐ์‹์œผ๋กœ ์„ค๊ณ„ํ•œ ์ด์œ ๋Š”, ์ฒ˜์Œ ์ž๋ฐ” ์–ธ์–ด๋ฅผ ๊ฐœ๋ฐœ ํ–ˆ์„๋•Œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝํ—˜์ด ์ ์€ ์‚ฌ๋žŒ๋„ ๋ณด๋‹ค ๊ฒฌ๊ณ ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ๋„ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ธ๋ฐ, ์‹ค์ œ๋กœ ๋ณ„๊ฒƒ ์•„๋‹Œ ์˜ˆ์™ธ๋„ checked exception ์œผ๋กœ ๋“ฑ๋กํ•œ ๊ฒƒ์ด ๊ฝค ๋งŽ๋‹ค.

์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ฒ˜์Œ ๊ฐœ๋ฐœ๋˜๋˜ 1990๋…„๋Œ€์™€ ์ง€๊ธˆ์˜ ์ปดํ“จํ„ฐ ํ™˜๊ฒฝ์€ ๋งŽ์ด ๋‹ฌ๋ผ์กŒ๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ๋กœ ๋Ÿฐํƒ€์ž„ ์˜ˆ์™ธ๋กœ ์ฒ˜๋ฆฌํ•ด๋„ ๋  ๊ฒƒ๋“ค์ด ์•„์ง๋„ checked exception์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ๊ฐ•์ œ์ ์œผ๋กœ try - catch ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ๊ณ , ๋˜ํ•œ ๋กœ์ง์ƒ Runtime Exception์œผ๋กœ ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ถ”๊ฐ€๋œ ๊ธฐ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

๋”ฐ๋ผ์„œ ์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ(chained exception)์„ ์ด์šฉํ•ด, checked ์˜ˆ์™ธ๋ฅผ unchecked ์˜ˆ์™ธ๋กœ ๋ฐ”๊พธ๋ฉด ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ์„ ํƒ์ ์ด ๋˜๋ฏ€๋กœ ์–ต์ง€๋กœ ๊ฑฐ์ถ”์žฅ ์Šค๋Ÿฌ์šด ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

class MyCheckedException extends Exception { ... } // checked excpetion

public class Main {
    public static void main(String[] args) {
            install();
    }

    public static void install() {
        throw new RuntimeException(new IOException("์„ค์น˜ํ•  ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค."));
        // Checked ์˜ˆ์™ธ์ธ IOException์„ Unchecked ์˜ˆ์™ธ์ธ RuntimeException์œผ๋กœ ๊ฐ์‹ธ Unchecked ์˜ˆ์™ธ๋กœ ๋ณ€์‹  ์‹œํ‚จ๋‹ค
    }
}

# ์ฐธ๊ณ ์ž๋ฃŒ

https://www.youtube.com/watch?v=I4XrVgCzKM4