item 73 doyoung - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

์•„์ดํ…œ73 ์ถ”์ƒํ™” ์ˆ˜์ค€์— ๋งž๋Š” ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋ผ

์˜ˆ์™ธ ๋ฒˆ์—ญ(exception translation)

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

์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋ ค๋ฉด ์ƒ์œ„ ๊ณ„์ธต์—์„œ๋Š” ์ €์ˆ˜์ค€ ์˜ˆ์™ธ๋ฅผ ์žก์•„ ์ž์‹ ์˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์— ๋งž๋Š” ์˜ˆ์™ธ๋กœ ๋ฐ”๊ฟ” ๋˜์ ธ์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์˜ˆ์™ธ ๋ฒˆ์—ญ(exception translation)์ด๋ผ ํ•œ๋‹ค.

try {
    ... // ์ €์ˆ˜์ค€ ์ถ”์ƒํ™”๋ฅผ ์ด์šฉํ•œ๋‹ค.
} catch (LowerLevelException e) {
    // ์ถ”์ƒํ™” ์ˆ˜์ค€์— ๋งž๊ฒŒ ๋ฒˆ์—ญํ•œ๋‹ค.
    throw new HigherLevelException(...);
}

AbstractSequentialList์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์˜ˆ์™ธ ๋ฒˆ์—ญ์˜ ์˜ˆ์‹œ

/**
* ์ด ๋ฆฌ์ŠคํŠธ ์•ˆ์˜ ์ง€์ •ํ•œ ์œ„์น˜์˜ ์›์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
* @throws IndexOutOfBoundsException index๊ฐ€ ๋ฒ”์œ„ ๋ฐ–์ด๋ผ๋ฉด,
* ์ฆ‰ ({@code index < 0 || index >= size()})์ด๋ฉด ๋ฐœ์ƒํ•œ๋‹ค.
*/
public E get(int index) {
    ListIterator<E> i = listIterator(index);
    try {
        return i.next();
    } catch (NoSuchElementException e) {
        throw new IndexOutOfBoundsException("์ธ๋ฑ์Šค: " + index);
    }
}

์˜ˆ์—์„œ ์ˆ˜ํ–‰ํ•œ ์˜ˆ์™ธ ๋ฒˆ์—ญ์€ List ์ธํ„ฐํŽ˜์ด์Šค์˜ get ๋ฉ”์„œ๋“œ ๋ช…์„ธ์— ๋ช…์‹œ๋œ ํ•„์ˆ˜์‚ฌํ•ญ์ž„์„ ๊ธฐ์–ตํ•ด๋‘์ž.

์˜ˆ์™ธ๋ฅผ ๋ฒˆ์—ญํ•  ๋•Œ, ์ €์ˆ˜์ค€ ์˜ˆ์™ธ๊ฐ€ ๋””๋ฒ„๊น…์— ๋„์›€์ด ๋œ๋‹ค๋ฉด ์˜ˆ์™ธ ์—ฐ์‡„(exception chaining)๋ฅผ ์‚ฌ์šฉํ•˜์ž

์˜ˆ์™ธ ์—ฐ์‡„๋ž€ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ(cause)์ธ ์ € ์ˆ˜์ค€ ์˜ˆ์™ธ๋ฅผ ๊ณ ์ˆ˜์ค€ ์˜ˆ์™ธ์— ์‹ค์–ด ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ณ„๋„์˜ ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ(Throwable์˜ getCause ๋ฉ”์„œ๋“œ)๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•˜๋ฉด ์–ธ์ œ๋“  ์ €์ˆ˜์ค€ ์˜ˆ์™ธ๋ฅผ ๊บผ๋‚ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

try {
    ... // ์ €์ˆ˜์ค€ ์ถ”์ƒํ™”๋ฅผ ์ด์šฉํ•œ๋‹ค.
} catch (LowerLevelException cause) {
    // ์ €์ˆ˜์ค€ ์˜ˆ์™ธ๋ฅผ ๊ณ ์ˆ˜์ค€ ์˜ˆ์™ธ์— ์‹ค์–ด ๋ณด๋‚ธ๋‹ค.
    throw new HigherLevelException(cause);
}

๊ทธ ์™ธ

  • ๋ฌดํ„ฑ๋Œ€๊ณ  ์˜ˆ์™ธ๋ฅผ ์ „ํŒŒํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค์•ผ ์˜ˆ์™ธ ๋ฒˆ์—ญ์ด ์šฐ์ˆ˜ํ•œ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ๊ทธ๋ ‡ ๋‹ค๊ณ  ๋‚จ์šฉํ•ด์„œ๋Š” ๊ณค๋ž€ํ•˜๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ €์ˆ˜์ค€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์„ฑ๊ณตํ•˜๋„๋ก ํ•˜์—ฌ ์•„๋ž˜ ๊ณ„์ธต์—์„œ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ตœ์„ ์ด๋‹ค.
  • ๋•Œ๋ก  ์ƒ์œ„ ๊ณ„์ธต ๋ฉ”์„œ๋“œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์•„๋ž˜ ๊ณ„์ธต ๋ฉ”์„œ๋“œ๋กœ ๊ฑด๋„ค๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ด ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฐจ์„ ์ฑ…๋„ ์•Œ์•„๋ณด์ž. ์•„๋ž˜ ๊ณ„์ธต์—์„œ์˜ ์˜ˆ์™ธ๋ฅผ ํ”ผํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ์ƒ์œ„ ๊ณ„์ธต์—์„œ ๊ทธ ์˜ˆ์™ธ๋ฅผ ์กฐ์šฉํžˆ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ API ํ˜ธ์ถœ์ž์—๊นŒ์ง€ ์ „ํŒŒํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

ํ•ต์‹ฌ์ •๋ฆฌ

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

โš ๏ธ **GitHub.com Fallback** โš ๏ธ