🐹 파이썬의 μ˜ˆμ™Έμ²˜λ¦¬

λ―Όλ‹¬νŒ½μ΄μš°μœ Β·2024λ…„ 6μ›” 2일

🐹 파이썬 기초

λͺ©λ‘ 보기
19/19

πŸ’‘ 1. μ˜ˆμ™Έ

μ˜ˆμ™Έ(Exception)λŠ” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 λ°œμƒν•  수 μžˆλŠ” μ˜ˆμƒμΉ˜ λͺ»ν•œ 문제 λ˜λŠ” 였λ₯˜ 상화을 μ˜λ―Έν•œλ‹€. μ˜ˆμ™Έκ°€ λ°œμƒˆν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ€ μ€‘λ‹¨λ˜κΈ° λ•Œλ¬Έμ— 이λ₯Ό μ μ ˆν•˜κ²Œ μ²˜λ¦¬ν•˜μ—¬ 쀑단을 λ°©μ§€ν•˜κ±°λ‚˜ 였λ₯˜μ— λŒ€ν•œ 정보λ₯Ό μ‚¬μš©μžμ—κ²Œ μ œκ³΅ν•΄μ•Όν•œλ‹€.

print(10 / 3)
print(4 / 2)
> print(5 / 0) ZeroDivisionError: division by zero
# νŒŒμ΄μ¬μ€ μ—λŸ¬κ°€ λ‚˜λ©΄ μ—λŸ¬ 이후λ₯Ό μ‹€ν–‰ν•˜μ§€ μ•ŠμŒ

πŸ’‘ 2. μ˜ˆμ™Έ 처리 κΈ°λ³Έ ꡬ쑰

μ˜ˆμ™Έ 처리의 κΈ°λ³Έ κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

try:
    # μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œ

except ExceptionType1:  # 'ExceptionType1'μ—λŠ” μ‹€μ œ μ˜ˆμ™Έ μœ ν˜•μ΄ λ“€μ–΄κ°‘λ‹ˆλ‹€.
    # ExceptionType1 μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ 싀행될 μ½”λ“œ

except ExceptionType2:  # 'ExceptionType2'μ—λŠ” λ‹€λ₯Έ μ˜ˆμ™Έ μœ ν˜•μ΄ λ“€μ–΄κ°‘λ‹ˆλ‹€.
    # ExceptionType2 μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ 싀행될 μ½”λ“œ

# 좔가적인 except 블둝을 계속 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

else:
    # try λΈ”λ‘μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜μ„ λ•Œ 싀행될 μ½”λ“œ

finally:
    # μ˜ˆμ™Έ λ°œμƒ 여뢀와 관계없이 항상 싀행될 μ½”λ“œ
try:
  print(10 / 3)
  print(5 / 0)
  print(4 / 2)
except:
  print('🐹: μ˜ˆμ™Έ λ°œμƒ!!')

print('ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.') # μ˜ˆμ™Έ λ°œμƒν•˜λ©΄ except둜 λ„˜μ–΄κ°„ λ’€ κ·Έλƒ₯ λ°‘μœΌλ‘œ 진행됨
> 3.3333333333333335
> 🐹: μ˜ˆμ™Έ λ°œμƒ!!
> ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.
try:
  print(10 / 3)
  print(5 / 0)
  print(4 / 2)
except ZeroDivisionError: # ν•΄λ‹Ή μ—λŸ¬μ— λŒ€ν•΄μ„œλ§Œ 처리
  print('0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.')

print('ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.')
> 3.3333333333333335
> 0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.
> ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.
try:
  data = [10, 20, 30, 40, 50]
  print(data[0])
  # print(int('일'))
  # μ²˜λ¦¬ν•΄μ€„ 수 μžˆλŠ” except ꡬ문이 μ—†κΈ° λ•Œλ¬Έμ— μ—λŸ¬ λ°œμƒ ν›„ ν”„λ‘œκ·Έλž¨ μ’…λ£Œ
  print(5 / 0)
  print(data[5])
  print(data[3])
except IndexError:
  print('인덱슀 지정이 μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')
except ZeroDivisionError:
  print('0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.')

print('ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.')
> 10
> 0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.
> ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.
try:
  data = [10, 20, 30, 40, 50]
  print(data[0])
  print(int('일'))
  print(5 / 0)
  print(data[5])
  print(data[3])
except:
  print('🐹: μ˜ˆμ™Έ λ°œμƒ!!')
# except IndexError:
  #print('인덱슀 지정이 μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')
# except ZeroDivisionError:
  # print('0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.')
# SyntaxError: default 'except:' must be last

print('ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.')
> 10
> 🐹: μ˜ˆμ™Έ λ°œμƒ!!
> ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.
try:
  data = [10, 20, 30, 40, 50]
  print(data[0])
  print(int('일'))
  print(5 / 0)
  print(data[5])
  print(data[3])
except IndexError:
  print('인덱슀 지정이 μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')
except ZeroDivisionError:
  print('0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.')
except:
  print('🐹: μ˜ˆμ™Έ λ°œμƒ!!')

print('ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.')
> 10
> 🐹: μ˜ˆμ™Έ λ°œμƒ!!
> ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.
try:
  data = [10, 20, 30, 40, 50]
  print(data[5])
  print(int('일'))
  print(5 / 0)
  print(data[3])
except IndexError as e:
  print(e) # 였λ₯˜ μ‹œ μ‚¬μš©μžκ°€ μ§€μ •ν•œ λ¬Έμž₯이 μ•„λ‹Œ 파이썬 κΈ°λ³Έ 였λ₯˜ λ©”μ„Έμ§€κ°€ λ‚˜μ˜€κ²Œ ν•˜κΈ°
except ZeroDivisionError as e:
  print(e) # μ–΄μ°¨ν”Ό 였λ₯˜λŠ” ν•˜λ‚˜μ΄κΈ° λ•Œλ¬Έμ— eλ₯Ό μ€‘λ³΅μœΌλ‘œ μ‚¬μš©ν•΄λ„ 됨
except Exception as e: # λͺ¨λ“  였λ₯˜λͺ…에 λŒ€ν•œ λΆ€λͺ¨ 클래슀
  print(e)

print('ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.')
> list index out of range
> ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.
try:
  data = [10, 20, 30, 40, 50]
  print(data[0])
except IndexError as e:
  print(e)
except ZeroDivisionError as e:
  print(e)
except Exception as e:
  print(e)
else:
  print('μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šμ€ 정상적인 ν”„λ‘œκ·Έλž¨μΌ λ•Œ 좜λ ₯')

print('ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.')
> μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šμ€ 정상적인 ν”„λ‘œκ·Έλž¨μΌ λ•Œ 좜λ ₯
> ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.
try:
  data = [10, 20, 30, 40, 50]
  print(data[0])
  print(data[5])
except IndexError as e:
  print(e)
except ZeroDivisionError as e:
  print(e)
except Exception as e:
  print(e)
else:
  print('μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šμ€ 정상적인 ν”„λ‘œκ·Έλž¨μΌ λ•Œ 좜λ ₯') # μ—λŸ¬κ°€ μ—†μœΌλ©΄ 좜λ ₯ X

print('ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.')
> 10
> list index out of range
> ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.
try:
  data = [10, 20, 30, 40, 50]
  print(data[0])
except IndexError as e:
  print(e)
except ZeroDivisionError as e:
  print(e)
except Exception as e:
  print(e)
else:
  print('μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šμ€ 정상적인 ν”„λ‘œκ·Έλž¨μΌ λ•Œ 좜λ ₯')
finally:
  print('였λ₯˜μ— 관계없이 무쑰건 μ‹€ν–‰λ˜λŠ” λ¬Έμž₯')

print('ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.')
> 10
> μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šμ€ 정상적인 ν”„λ‘œκ·Έλž¨μΌ λ•Œ 좜λ ₯
> 였λ₯˜μ— 관계없이 무쑰건 μ‹€ν–‰λ˜λŠ” λ¬Έμž₯
> ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.
try:
  data = [10, 20, 30, 40, 50]
  print(data[0])
  print(data[5])
except IndexError as e:
  print(e)
except ZeroDivisionError as e:
  print(e)
except Exception as e:
  print(e)
else:
  print('μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•Šμ€ 정상적인 ν”„λ‘œκ·Έλž¨μΌ λ•Œ 좜λ ₯')
finally:
  print('였λ₯˜μ— 관계없이 무쑰건 μ‹€ν–‰λ˜λŠ” λ¬Έμž₯') # dbλ‚˜ λ„€νŠΈμ›Œν¬ μž‘μ—…μ„ λ°˜λ³΅ν•  λ•Œ λ§ˆμ§€λ§‰ print와 λ‹€λ₯΄κ²Œ μ‚¬μš©ν•  일이 μžˆμ„ 수 있음

print('ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.')
> 10
> list index out of range
> 였λ₯˜μ— 관계없이 무쑰건 μ‹€ν–‰λ˜λŠ” λ¬Έμž₯
> ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€.

πŸ’‘ 3. Exception 클래슀

Exception ν΄λž˜μŠ€λŠ” 파이썬의 λ‚΄μž₯ μ˜ˆμ™Έ 계측 κ΅¬μ‘°μ—μ„œ 거의 λͺ¨λ“  λ‚΄μž₯ μ˜ˆμ™Έμ˜ κΈ°λ³Έ ν΄λž˜μŠ€μ΄λ‹€. 이 ν΄λž˜μŠ€λŠ” μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έλ₯Ό λ§Œλ“€κ±°λ‚˜ νŠΉμ • μ˜ˆμ™Έ μœ ν˜•μ„ 작기 μœ„ν•œ 기본적인 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•œλ‹€.

try:
  raise Exception('μ˜ˆμ™Έ λ°œμƒ') # μ˜ˆμ™Έ λ§Œλ“¦
except Exception as e:
  print(e)
> μ˜ˆμ™Έ λ°œμƒ
def func1():
  n = int(input('짝수λ₯Ό μž…λ ₯ν•˜μ„Έμš”: '))
  if n % 2 == 1:
    raise Exception('ν™€μˆ˜λ₯Ό μž…λ ₯ν–ˆμ–΄μš”')
  print(n)
try:
  func1()
except Exception as e:
  print('🐹: μ˜ˆμ™Έ λ°œμƒ!!!', e)
> 짝수λ₯Ό μž…λ ₯ν•˜μ„Έμš”: 3
> 🐹: μ˜ˆμ™Έ λ°œμƒ!!! ν™€μˆ˜λ₯Ό μž…λ ₯ν–ˆμ–΄μš”
def func1():
  func2()

def func2():
  func3()

def func3():
  print('%d' % 'λ¬Έμžμ—΄')
> TypeError: %d format: a real number is required, not str
# ν•¨μˆ˜κ°€ λ°”λ‘œ μ‹€ν–‰λ˜μ§€λŠ” μ•ŠκΈ° λ•Œλ¬Έμ— μœ„μ—μ„œλŠ” μ—λŸ¬κ°€ μ•ˆλ‚œλ‹€.
try:
  func1()
except TypeError:
  print('νƒ€μž…μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')
> νƒ€μž…μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
def func1():
  try:
    func2()
  except TypeError:
    print('νƒ€μž…μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')

def func2():
  func3()

def func3():
  print('%d' % 'λ¬Έμžμ—΄')

func1()
> νƒ€μž…μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
def func1():
  func2()

def func2():
  try:
    func3()
  except TypeError:
    print('νƒ€μž…μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')

def func3():
  print('%d' % 'λ¬Έμžμ—΄')

func1()
> νƒ€μž…μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
def func1():
  func2()

def func2():
  func3()

def func3():
  try:
    print('%d' % 'λ¬Έμžμ—΄')
  except TypeError:
    print('νƒ€μž…μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')

func1()

# μ—λŸ¬ 처리 ꡬ문은 어디에 λ“€μ–΄κ°€λ“ μ§€ 상관이 μ—†λ‹€.
> νƒ€μž…μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

πŸ’‘ 4. μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ 클래슀λ₯Ό 직접 λ§Œλ“€κ³  ν™œμš©ν•˜κΈ°

# 20μ‚΄ 미만: λ‚˜μ΄ λ²”μœ„λ³΄λ‹€ μ–΄λ¦Ό
# 20μ‚΄ ~ 50μ‚΄: λ‚˜μ΄ λ²”μœ„ μ•ˆμ— 포함
# 50μ‚΄ 초과: λ‚˜μ΄ λ²”μœ„λ³΄λ‹€ 큼

class AgeLimitError(Exception):
  def __init__(self, age, message='μ›ν•˜λŠ” λ‚˜μ΄ λ²”μœ„κ°€ μ•„λ‹˜'): # λ©”μ„Έμ§€μ˜ κΈ°λ³Έκ°’ 섀정함
    self.age = age
    self.message = message
    super().__init__(self.message) # Exception ν΄λž˜μŠ€μ— λ©”μ„Έμ§€ 보냄 (Exception(message))
def check_age(age):
  if age < 20:
    raise AgeLimitError(age, 'λ‚˜μ΄ λ²”μœ„λ³΄λ‹€ μ–΄λ¦Ό')
  elif age > 50:
    raise AgeLimitError(age, 'λ‚˜μ΄ λ²”μœ„λ³΄λ‹€ 큼')
  else:
    return 'λ‚˜μ΄ λ²”μœ„ μ•ˆμ— 포함'
ages = [17, 60, 46, 20, 52, 26]

for age in ages:
  try:
    print(check_age(age))
  except AgeLimitError as e:
    print(f'{e.age} λ‚˜μ΄ μ—λŸ¬: {e}')
> 17 λ‚˜μ΄ μ—λŸ¬: λ‚˜μ΄ λ²”μœ„λ³΄λ‹€ μ–΄λ¦Ό
> 60 λ‚˜μ΄ μ—λŸ¬: λ‚˜μ΄ λ²”μœ„λ³΄λ‹€ 큼
> λ‚˜μ΄ λ²”μœ„ μ•ˆμ— 포함
> λ‚˜μ΄ λ²”μœ„ μ•ˆμ— 포함
> 52 λ‚˜μ΄ μ—λŸ¬: λ‚˜μ΄ λ²”μœ„λ³΄λ‹€ 큼
> λ‚˜μ΄ λ²”μœ„ μ•ˆμ— 포함
profile
μ–΄λ–»κ²Œ ν–„μŠ€ν„°κ°€ 개발자

0개의 λŒ“κΈ€