๐Ÿ“‚ JAVA/์ฃผ์š” ๊ฐœ๋…

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

Amenable 2023. 1. 28. 16:06

1. try-with-resources๋ฌธ โ›ณ

try (SomeResource resource = getResource()) {
  use(resource);
} catch(Exception e) {
  ...
}

  JDK1.7๋ถ€ํ„ฐ try-with-resources๋ฌธ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. try-with-resources๋ฌธ์˜ ๊ด„ํ˜ธ() ์•ˆ์— ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์žฅ์„ ๋„ฃ์œผ๋ฉด, ์ด ๊ฐ์ฒด๋Š” ๋”ฐ๋กœ close()๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ try๋ธ”๋Ÿญ์„ ๋ฒ—์–ด๋‚˜๋Š” ์ˆœ๊ฐ„ ์ž๋™์ ์œผ๋กœ close()๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  catch๋ธ”๋Ÿญ ๋˜๋Š” finally๋ธ”๋Ÿญ์ด ๋”ฐ๋ผ์˜ค๊ฒŒ ๋œ๋‹ค.

  ์ด๋•Œ try-with-resources๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๊ฐ์ฒด์˜ close()๊ฐ€ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ํด๋ž˜์Šค๊ฐ€ AutoCloseable์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด์–ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ, ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณต์ˆ˜์˜ ์ž์› ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

try (Something1 s1 = new Something1();
	Something2 s2 = new Something2()) {
  use(resource);
} catch(Exception e) {
  ...
}

  try-with-resources์˜ ์žฅ์ ์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋งํฌ๋œ ๊ธ€์„ ์ฐธ์กฐํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.

 

2. ์‚ฌ์šฉ์ž์ •์˜ ์˜ˆ์™ธ ๐ŸŽณ

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

// ์‚ฌ์šฉ์ž์ •์˜ ์˜ˆ์™ธ ์ž‘์„ฑ ์˜ˆ์‹œ
class MyException extends Exception {
  MyException(String msg) {
  	super(msg + "์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
  }
}

 

3. ์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ(Chained Exception) ๐ŸฅŒ

  ํ•œ ์˜ˆ์™ธ๊ฐ€ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. A๊ฐ€ ์˜ˆ์™ธ B๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค๋ฉด A๋ฅผ B์˜ '์›์ธ ์˜ˆ์™ธ(cause exception)'๋ผ๊ณ  ํ•œ๋‹ค. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ B๋ฅผ ์ƒ์„ฑํ•œ ํ›„, initCause()๋กœ A๋ฅผ B์˜ ์›์ธ ์˜ˆ์™ธ๋กœ ๋“ฑ๋กํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  'throw'๋กœ ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.

try {
} catch (AException e) {
  B b = new B("์˜ˆ์™ธ ๋ฐœ์ƒ");
  b.initCause(e);
  throw b;
}

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

try {
  throw new ChildException1();
  throw new ChildException2();
} catch (ParentException e) {
  ... // ์–ด๋–ค ์ž์†์˜ ์˜ˆ์™ธ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค.
}

  ์ด๋•Œ ์˜ˆ์™ธ๊ฐ€ ์›์ธ ์˜ˆ์™ธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค๋ฉด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค. 

public static void main(String args[]) {
  try {
    method();
  } catch (ParentException e) {
    e.printStackTrace();
  }
}

static void method() throws ChildException1, ChildException2 {
  try {
  	checkSeat();
  } catch(ChildException1 e) {
    ParentException pe = new ParentException("ParentException ๋ฐœ์ƒ");
    ie.initCause(e);
    throw e;
  } catch(ChildException2 e) {
    ParentException pe = new ParentException("ParentException ๋ฐœ์ƒ");
    ie.initCause(e);
    throw e;
  }
  
}

static void checkSeat() throws ChildException1, ChildException2 {
  if(!isChild1Seat(){
  	throw new ChildException1("Child1์˜ ์ž๋ฆฌ๊ฐ€ ์•„๋‹˜");
  }
  
  if(!isChild2Seat(){
  	throw new ChildException2("Child2์˜ ์ž๋ฆฌ๊ฐ€ ์•„๋‹˜");
  }
}

// 'ParentException ๋ฐœ์ƒ'์œผ๋กœ ํฐ ๋ถ„๋ฅ˜์˜ ์˜ˆ์™ธ๋ฅผ ๋ฌถ์„ ์ˆ˜ ์žˆ๊ณ 
// 'Child1์˜ ์ž๋ฆฌ๊ฐ€ ์•„๋‹˜'๊ณผ 'Child2์˜ ์ž๋ฆฌ๊ฐ€ ์•„๋‹˜'์„ ํ†ตํ•ด ์‹ค์ œ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๊ฐ€ ์–ด๋–ค ๊ฒƒ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
// ChildException1๊ณผ ChildException2์˜ ์ƒ์†๊ด€๊ณ„๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

  ์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ(Chained Exception)์˜ ๋˜ ๋‹ค๋ฅธ ์žฅ์ ์œผ๋กœ๋Š” checked์˜ˆ์™ธ๋ฅผ unchecked์˜ˆ์™ธ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

static void method() throws MemoryException {
  if(!enoughMemory())
    throw new MemoryException("๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ");
}

  ์œ„์˜ ์ฝ”๋“œ์—์„œ method()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด checkedException์ธ MemoryException์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ try-catch๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

static void method() {
  if(!enoughMemory())
    throw new RuntimeException(new MemoryException("๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ"));
}

  ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์ด MemoryException์„ RuntimeException์œผ๋กœ ๊ฐ์‹ธ์ฃผ๋ฉด unchecked์˜ˆ์™ธ๊ฐ€ ๋˜๊ณ , ๊ทธ๋ž˜์„œ throws MemoryException์„ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. (RuntimeException์˜ ์ƒ์„ฑ์ž๋ฅผ initCause() ๋Œ€์‹  ์‚ฌ์šฉํ•˜์˜€๋‹ค.)

 

ํ•ด๋‹น ๊ธ€์€ ๋‚จ๊ถ ์„ฑ๋‹˜์˜ Java์˜ ์ •์„์„ ์ฝ๊ณ  ์ž‘์„ฑํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.