Thanks to visit codestin.com
Credit goes to github.com

Skip to content

μ•„μ΄ν…œ 73. 좔상화 μˆ˜μ€€μ— λ§žλŠ” μ˜ˆμ™Έλ₯Ό λ˜μ§€λΌ - FinΒ #181

@Irisation23

Description

@Irisation23

Discussed in https://github.com/orgs/Study-2-Effective-Java/discussions/172

Originally posted by bunsung92 March 21, 2023
πŸ“ ꡬ성

Table of contents generated with markdown-toc


0. TL;DR πŸ“š

  • μ•„λž˜ κ³„μΈ΅μ˜ μ˜ˆμ™Έ μ²˜λ¦¬κ°€ μ–΄λ ΅κ³ , κ·Έ μ˜ˆμ™Έλ₯Ό μƒμœ„ 계측을 톡해 λ…ΈμΆœν•œλ‹€λ©΄ μ˜ˆμ™Έ λ²ˆμ—­μ„ μ‚¬μš©ν•˜λΌ.
  • μ˜ˆμ™Έ 연쇄λ₯Ό μ΄μš©ν•˜λ©΄ μƒμœ„ κ³„μΈ΅μ—λŠ” λ§₯락에 μ–΄μšΈλ¦¬λŠ” κ³ μˆ˜μ€€ μ˜ˆμ™Έλ₯Ό λ˜μ§€λ©΄μ„œ κ·Όλ³Έ 원인도 ν•¨κ»˜ μ•Œλ €μ£Όμ–΄ 였λ₯˜ 뢄석에 도움이 λœλ‹€.

μ˜ˆμ™Έ λ²ˆμ—­? μ˜ˆμ™Έ 연쇄?


1. 잘λͺ» 처리된 μ˜ˆμ™Έ

  • λ©”μ„œλ“œκ°€ μ €μˆ˜μ€€ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜μ§€ μ•Šκ³ , λ°”κΉ₯으둜 μ „νŒŒν•˜λŠ” 경우 (λ°œμƒ μœ„μΉ˜μ—μ„œ μ˜ˆμ™Έ μ²˜λ¦¬ν•˜μ§€ μ•ŠλŠ” 경우λ₯Ό 말함) 에 λŒ€ν•œ 문제 λ°œμƒ
    • μˆ˜ν–‰ν•˜λ €λŠ” 일과 κ΄€λ ¨μ—†λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•  μˆ˜μžˆλ‹€.
    • κ΅¬ν˜„ 방식을 λ°”κΎΈλ©΄ 또 λ‹€λ₯Έ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œμΌœ κΈ°μ‘΄ ν΄λΌμ΄μ–ΈνŠΈ ν”„λ‘œκ·Έλž¨μ„ 깨뜨릴 수 μžˆλ‹€.

2. μ˜ˆμ™Έ λ²ˆμ—­(Exception Translation)

μœ„μ™€ 같은 μƒν™©μ—μ„œμ˜ ν•΄κ²°μ±…μœΌλ‘œ μ œμ‹œ 될 수 μžˆλŠ” 방법이닀.

  • μƒμœ„ κ³„μΈ΅μ—μ„œλŠ” μ €μˆ˜μ€€ μ˜ˆμ™Έλ₯Ό μž‘μ•„ μžμ‹ μ˜ 좔상화 μˆ˜μ€€μ— λ§žλŠ” μ˜ˆμ™Έλ‘œ λ°”κΏ” λ˜μ Έμ•Ό ν•œλ‹€.
public abstract class AbstractSequentialList<E> extends AbstractList<E> {
    
    /**
     * Returns the element at the specified position in this list.
     *
     * @param index index of the element to return
     * @return the element at the specified position in this list
     * @throws IndexOutOfBoundsException if the index is out of range
     *         (index < 0 || index >= size())
     */
    public E get(int index) {
        try {
            return listIterator(index).next();
        } catch (NoSuchElementException exc) {
            throw new IndexOutOfBoundsException("Index: "+index);
        }
    }
}
  • μ˜ˆμ™Έ λ²ˆμ—­μ‹œ μ €μˆ˜μ€€ μ˜ˆμ™Έκ°€ 디버깅에 도움이 λœλ‹€λ©΄ μ˜ˆμ™Έ 연쇄(exception chanining)을 μ‚¬μš©ν•˜λŠ”κ²Œ μ’‹λ‹€.

3. μ˜ˆμ™Έ 연쇄(exception chanining)

문제의 κ·Όλ³Έ 원인(cause)인 μ €μˆ˜μ€€ μ˜ˆμ™Έλ₯Ό κ³ μˆ˜μ€€ μ˜ˆμ™Έμ— μ‹€μ–΄ λ³΄λ‚΄λŠ” 방식이닀.

μ˜ˆμ™Έ μ—°μ‡„λΌλŠ” μš©μ–΄λ₯Ό 보닀 더 μ‰½κ²Œ μ΄ν•΄ν•˜κΈ°μ— 쒋은 방법은 μƒμŠΉμ΄λΌλŠ” ν‚€μ›Œλ“œλ₯Ό 생각 ν•΄ λ³΄λŠ”κ²Œ 쒋을것 κ°™λ‹€.
μ €μˆ˜μ€€ -> κ³ μˆ˜μ€€
보닀 더 μΆ”μƒν™”λœ ν΄λž˜μŠ€μ—μ„œμ˜ μ˜ˆμ™Έ μ²˜λ¦¬λ“±μ„ ν‚€μ›Œλ“œλ‘œ μž‘μ„ 수 μžˆλ‹€.

  • λ³„λ„μ˜ μ ‘κ·Όμž λ©”μ„œλ“œ(Throwable 의 getCause()) λ₯Ό 톡해 ν•„μš”ν•˜λ‹€λ©΄ μ–Έμ œλ“  μ €μˆ˜μ€€ μ˜ˆμ™Έλ₯Ό κΊΌλ‚΄ λ³Ό 수 μžˆλ‹€.
class HigherLevelException extends Exception {
    HigherLevelException(Throwable cause) {
        super(cause);
    }
}

class ChildClass {
    public void publicAPIMethod() {
        try {
            //do somthing...
        } catch (LowerLevelException cause) {
            throw new HigherLevelException(cause);
        }
    }
}
  • λŒ€λΆ€λΆ„μ˜ ν‘œμ€€ μ˜ˆμ™ΈλŠ” μ˜ˆμ™Έ μ—°μ‡„μš© μƒμ„±μžλ₯Ό κ°–κ³  μžˆλ‹€.
  • μ˜ˆμ™Έ μ—°μ‡„λŠ” 문제의 원인을 (getCause λ©”μ„œλ“œ) ν”„λ‘œκ·Έλž¨μ—μ„œ μ ‘κ·Όν•  수 있게 ν•΄μ£Όλ©°, 원인과 κ³ μˆ˜μ€€ μ˜ˆμ™Έμ˜ μŠ€νƒ 좔적 정보 톡합을 ν•΄μ€€λ‹€.
  • μ˜ˆμ™Έλ₯Ό μ „νŒŒν•˜λŠ” 것보닀 μ˜ˆμ™Έ λ²ˆμ—­ν•˜λŠ” 것이 μš°μˆ˜ν•œ 방법 μ΄μ§€λ§Œ λ‚¨μš©ν•΄μ„œλŠ” μ•ˆλœλ‹€.
  • κ°€λŠ₯ν•˜λ‹€λ©΄ μ €μˆ˜μ€€ λ©”μ„œλ“œλŠ” μ˜ˆμ™Έλ₯Ό λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν•˜λŠ”κ²ƒμ΄ μ΅œμ„ μ΄λ‹€.
  • λ•Œλ‘œλŠ” μƒμœ„ 계측 λ©”μ„œλ“œ 의 λ§€κ°œλ³€μˆ˜ 값을 μ•„λž˜ 계측 λ©”μ„œλ“œλ‘œ 건내기 전에 미리 κ²€μ‚¬ν•˜λŠ” λ°©λ²•μœΌλ‘œ λͺ©μ μ„ 달성할 수 μžˆλ‹€.(μ•„μ΄ν…œ 49. λ§€κ°œλ³€μˆ˜κ°€ μœ νš¨ν•œμ§€ κ²€μ‚¬ν•˜λΌΒ #114 )

3.1 μ°¨μ„ μ±…

  • μ•„λž˜ κ³„μΈ΅μ—μ„œμ˜ μ˜ˆμ™Έλ₯Ό ν”Όν•  수 μ—†λ‹€λ©΄, μƒμœ„ κ³„μΈ΅μ—μ„œ κ·Έ μ˜ˆμ™Έλ₯Ό 쑰용히 μ²˜λ¦¬ν•˜μ—¬ 문제λ₯Ό API ν˜ΈμΆœμžμ—κ²Œ μ „νŒŒν•˜μ§€ μ•ŠλŠ” 방법이 μžˆλ‹€.
  • μƒμœ„ κ³„μΈ΅μ—μ„œ ν•΄λ‹Ή 처리λ₯Ό μ΄μ—ˆλ‹€λ©΄ λ‘œκΉ…μ„ 톡해 κΈ°λ‘ν•˜λŠ”κ²Œ μ’‹λ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ™€ μ‚¬μš©μžμ—κ²Œ 문제λ₯Ό μ „νŒŒν•˜μ§€ μ•ŠμœΌλ©΄μ„œ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 둜그λ₯Ό 뢄석해 μΆ”κ°€ 쑰치λ₯Ό μ·¨ν•  수 μžˆλ„λ‘ ν•΄μ£ΌκΈ° λ•Œλ¬Έμ΄λ‹€.
image

4. μ΅œμ’… 정리 πŸ“š

κ·Έλž˜μ„œ 좔상화 μˆ˜μ€€μ— λ§žλŠ” μ˜ˆμ™ΈλŠ” λ¬΄μ—‡μΌκΉŒ? πŸ€”

  • μ˜ˆμ™Έ λ²ˆμ—­κ³Ό μ˜ˆμ™Έ 연쇄λ₯Ό κ³ λ €ν•œ μ˜ˆμ™Έμ˜ μ²˜λ¦¬μ΄λ‹€.
  • μ˜ˆμ™Έ λ²ˆμ—­μ€ μ €μˆ˜μ€€ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜κ³  μžˆλŠ” μžμ‹ (this) μˆ˜μ€€μ— λ§žλŠ” μ˜ˆμ™Έλ‘œ λ°”κΏ” λ˜μ§€λŠ” 것이닀.
  • μ˜ˆμ™Έ μ—°μ‡„λŠ” 문제의 원인(cause) μ €μˆ˜μ€€ μ˜ˆμ™Έλ₯Ό κ³ μˆ˜μ€€ μ˜ˆμ™Έμ— μ‹€μ–΄ λ³΄λ‚΄λŠ” 방식이닀.

5. 회고 🧹

2023-03-26 일

  • κ³ μˆ˜μ€€, μ €μˆ˜μ€€, μ˜ˆμ™Έ λ²ˆμ—­, μ˜ˆμ™Έ 연쇄 λ“±λ“± μš©μ–΄κ°€ μ‰½μ§€μ•Šμ€ νŒŒνŠΈμ˜€λ‹€.
  • 원인을 λ˜μ Έμ£Όλƒκ°€ μ˜ˆμ™Έ λ²ˆμ—­κ³Ό μ˜ˆμ™Έ 연쇄λ₯Ό ꡬ뢄 μ§€μ–΄μ£ΌλŠ” 포인트라 생각 ν•  수 μžˆλŠ”κ²ƒ κ°™λ‹€.
  • μ˜ˆμ™Έλ₯Ό λ‹€λ£¨λŠ” 일은 μ–Έμ œλ‚˜ μ€‘μš”ν•˜λ©°, λ‘œκΉ…ν•˜λŠ” μŠ΅κ΄€ μ—­μ‹œ λΌˆμ— λ°•μ•„μ•Ό ν•œλ‹€κ³  μƒκ°ν•œλ‹€.
  • λ”°λΌμ„œ, 진행될 ν”„λ‘œμ νŠΈμ—λŠ” μ˜ˆμ™Έλ„ 상황에 맞게, μ›ν•˜λŠ” μ˜ˆμ™Έ 처리λ₯Ό ν•  수 μžˆλ„λ‘ λ…Έλ ₯ν•΄μ•Όκ² λ‹€.

좜처

https://github.com/Meet-Coder-Study/book-effective-java/blob/main/10%EC%9E%A5/73_%EC%B6%94%EC%83%81%ED%99%94_%EC%88%98%EC%A4%80%EC%97%90_%EB%A7%9E%EB%8A%94_%EC%98%88%EC%99%B8%EB%A5%BC_%EB%8D%98%EC%A0%B8%EB%9D%BC_%EA%B9%80%EC%84%9D%EB%9E%98.md
https://data-flair.training/blogs/java-exception/

Metadata

Metadata

Assignees

Labels

10μž₯ μ˜ˆμ™Έμ΄νŽ™ν‹°λΈŒ μžλ°” 10μž₯ (μ˜ˆμ™Έ)

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions