Created at : 2024-09-02 13:49
Auther: Soo.Y

7. μ˜ˆμ™Έ 처리 (Exception Handling)

ν”„λ‘œκ·Έλž˜λ°μ„ ν•  λ•Œ, μ˜ˆμƒμΉ˜ λͺ»ν•œ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 것은 ν”ν•œ μΌμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ 였λ₯˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ κ°‘μž‘μŠ€λŸ½κ²Œ μ’…λ£Œλ˜κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. νŒŒμ΄μ¬μ—μ„œλŠ” μ΄λŸ¬ν•œ 였λ₯˜λ₯Ό μ˜ˆμ™Έ(Exception)라고 ν•˜λ©°, μ˜ˆμ™Έ 처리λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€. 이 μž₯μ—μ„œλŠ” νŒŒμ΄μ¬μ—μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법과 μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έλ₯Ό λ‹€λ£¨λŠ” 방법을 λ°°μ›λ‹ˆλ‹€.

7.1 μ˜ˆμ™Έμ˜ κΈ°λ³Έ κ°œλ…

μ˜ˆμ™Έ(Exception)λŠ” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑에 λ°œμƒν•˜λŠ” 였λ₯˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ˜ 흐름이 μ€‘λ‹¨λ˜κ³ , 였λ₯˜ λ©”μ‹œμ§€κ°€ 좜λ ₯λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ˜ˆμ™Έλ₯Ό μ μ ˆν•˜κ²Œ μ²˜λ¦¬ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ§€ μ•Šκ³  계속 싀행될 수 μžˆμŠ΅λ‹ˆλ‹€.

  • κΈ°λ³Έ μ˜ˆμ™Έ λ°œμƒ:
x = 10 / 0  # ZeroDivisionError λ°œμƒ

μœ„ μ½”λ“œλŠ” ZeroDivisionError μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€. 0으둜 λ‚˜λˆ„λŠ” 연산은 ν—ˆμš©λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

7.2 try와 exceptλ₯Ό μ‚¬μš©ν•œ μ˜ˆμ™Έ 처리

νŒŒμ΄μ¬μ—μ„œλŠ” try와 except 블둝을 μ‚¬μš©ν•˜μ—¬ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. try 블둝 μ•ˆμ— μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³ , except 블둝 μ•ˆμ— μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ μ‹€ν–‰ν•  μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.

  • κΈ°λ³Έ ꡬ쑰:
try:
    μ‹€ν–‰ν• _μ½”λ“œ
except μ˜ˆμ™Ένƒ€μž…:
    μ˜ˆμ™Έκ°€_λ°œμƒν–ˆμ„_λ•Œ_μ‹€ν–‰ν• _μ½”λ“œ
  • 예제:
try:
    x = 10 / 0
except ZeroDivisionError:
    print("0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.")

이 μ½”λ“œλŠ” ZeroDivisionError μ˜ˆμ™Έκ°€ λ°œμƒν•  λ•Œ β€œ0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.β€λΌλŠ” λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜κ³ , ν”„λ‘œκ·Έλž¨μ΄ μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜λ„λ‘ ν•©λ‹ˆλ‹€.

7.3 μ—¬λŸ¬ μ˜ˆμ™Έ 처리

ν•˜λ‚˜μ˜ try 블둝에 λŒ€ν•΄ μ—¬λŸ¬ 개의 except 블둝을 μ‚¬μš©ν•˜μ—¬ μ„œλ‘œ λ‹€λ₯Έ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 예제
try:
    x = int(input("숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”: "))
    y = 10 / x
except ValueError:
    print("μœ νš¨ν•œ 숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”.")
except ZeroDivisionError:
    print("0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.")

이 μ˜ˆμ œμ—μ„œλŠ” μ‚¬μš©μžκ°€ μˆ«μžκ°€ μ•„λ‹Œ 값을 μž…λ ₯ν–ˆμ„ λ•Œμ™€, 0을 μž…λ ₯ν–ˆμ„ λ•Œ 각각의 μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€.

7.4 λͺ¨λ“  μ˜ˆμ™Έ 처리

λͺ¨λ“  μ˜ˆμ™Έλ₯Ό ν¬κ΄„μ μœΌλ‘œ μ²˜λ¦¬ν•˜κ³  싢을 λ•ŒλŠ” except 블둝에 μ˜ˆμ™Έ νƒ€μž…μ„ λͺ…μ‹œν•˜μ§€ μ•Šκ³  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 예제
try:
    x = int(input("숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”: "))
    y = 10 / x
except:
    print("μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.")

이 μ½”λ“œμ—μ„œλŠ” μ–΄λ–€ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ”λΌλ„ β€œμ˜ˆμ™Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.β€λΌλŠ” λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

7.5 else와 finally 블둝

νŒŒμ΄μ¬μ—μ„œλŠ” try와 except 블둝과 ν•¨κ»˜ else와 finally 블둝을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • else 블둝: try λΈ”λ‘μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜μ„ λ•Œ μ‹€ν–‰λ©λ‹ˆλ‹€.

  • finally 블둝: μ˜ˆμ™Έ λ°œμƒ 여뢀와 상관없이 항상 μ‹€ν–‰λ©λ‹ˆλ‹€. 파일 닫기와 같은 정리 μž‘μ—…μ— μœ μš©ν•©λ‹ˆλ‹€.

  • 예제:

try:
    x = int(input("숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”: "))
    y = 10 / x
except ZeroDivisionError:
    print("0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.")
except ValueError:
    print("μœ νš¨ν•œ 숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”.")
else:
    print(f"κ²°κ³ΌλŠ” {y}μž…λ‹ˆλ‹€.")
finally:
    print("ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.")

이 μ˜ˆμ œμ—μ„œ else 블둝은 μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜μ„ λ•Œλ§Œ μ‹€ν–‰λ˜λ©°, finally 블둝은 항상 μ‹€ν–‰λ©λ‹ˆλ‹€.

7.6 μ˜ˆμ™Έ 객체

μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ μ˜ˆμ™Έ 객체가 μƒμ„±λ©λ‹ˆλ‹€. μ˜ˆμ™Έ κ°μ²΄μ—λŠ” 였λ₯˜ λ©”μ‹œμ§€μ™€ 같은 정보λ₯Ό λ‹΄κ³  있으며, except λΈ”λ‘μ—μ„œ 이λ₯Ό ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 예제:
try:
    x = int(input("숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”: "))
    y = 10 / x
except Exception as e:
    print(f"μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {e}")

이 μ½”λ“œμ—μ„œλŠ” μ˜ˆμ™Έ 객체 eλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°œμƒν•œ μ˜ˆμ™Έμ— λŒ€ν•œ ꡬ체적인 정보λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

7.7 μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ

κΈ°λ³Έ μ˜ˆμ™Έ 외에도, ν”„λ‘œκ·Έλž¨μ˜ μš”κ΅¬μ— λ§žλŠ” μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έλ₯Ό λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μž μ •μ˜ μ˜ˆμ™ΈλŠ” 기본적으둜 Exception 클래슀λ₯Ό 상속받아 μ •μ˜ν•©λ‹ˆλ‹€.

  • 예제:
class NegativeNumberError(Exception):
    pass
 
def check_positive(number):
    if number < 0:
        raise NegativeNumberError("μŒμˆ˜λŠ” ν—ˆμš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.")
 
try:
    num = int(input("μ–‘μˆ˜λ₯Ό μž…λ ₯ν•˜μ„Έμš”: "))
    check_positive(num)
except NegativeNumberError as e:
    print(e)

이 μ˜ˆμ œμ—μ„œλŠ” NegativeNumberErrorλΌλŠ” μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έλ₯Ό μ •μ˜ν•˜κ³ , 음수λ₯Ό μž…λ ₯ν–ˆμ„ λ•Œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚΅λ‹ˆλ‹€.

7.8 μ˜ˆμ™Έ 처리의 μ€‘μš”μ„±

μ˜ˆμ™Έ μ²˜λ¦¬λŠ” ν”„λ‘œκ·Έλž¨μ˜ μ•ˆμ •μ„±μ„ λ†’μ΄λŠ” 데 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. μ˜ˆμ™Έ 처리λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ΄ μ˜ˆμƒμΉ˜ λͺ»ν•œ μƒν™©μ—μ„œλ„ μ μ ˆν•˜κ²Œ λŒ€μ²˜ν•  수 있으며, μ‚¬μš©μžμ—κ²Œ μœ μš©ν•œ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό μ œκ³΅ν•˜κ³ , ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜λŠ” 것을 λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • μ˜ˆμ™Έ 처리의 효과:
    1. ν”„λ‘œκ·Έλž¨μ˜ μ‹ λ’°μ„± ν–₯상: μ˜ˆμ™Έκ°€ λ°œμƒν•΄λ„ ν”„λ‘œκ·Έλž¨μ΄ κ°‘μž‘μŠ€λŸ½κ²Œ μ’…λ£Œλ˜μ§€ μ•Šκ³ , μ •ν•΄μ§„ λŒ€λ‘œ μ²˜λ¦¬λ˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    2. μœ μ € κ²½ν—˜ κ°œμ„ : μ‚¬μš©μžκ°€ 였λ₯˜λ₯Ό κ²ͺ을 λ•Œ, 의미 μžˆλŠ” 였λ₯˜ λ©”μ‹œμ§€λ₯Ό μ œκ³΅ν•˜μ—¬ 문제λ₯Ό μ΄ν•΄ν•˜κ³  ν•΄κ²°ν•  수 있게 λ•μŠ΅λ‹ˆλ‹€.
    3. 디버깅 μš©μ΄μ„± 증가: μ˜ˆμ™Έ 객체λ₯Ό ν™œμš©ν•˜μ—¬ μ •ν™•ν•œ 였λ₯˜ 원인을 νŒŒμ•…ν•˜κ³ , μ½”λ“œλ₯Ό κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이제 νŒŒμ΄μ¬μ—μ„œ μ˜ˆμ™Έ 처리의 κ°œλ…κ³Ό μ‚¬μš© 방법에 λŒ€ν•΄ μ΄ν•΄ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ˜ˆμ™Έ 처리λ₯Ό 톡해 λ”μš± κ²¬κ³ ν•˜κ³  μ‹ λ’°ν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ΄€λ ¨ λ¬Έμ„œ

1. 파이썬(Python) μ΄λž€