λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Language/Python

[Python]파이썬 μ˜ˆμ™Έ 처리 λ§ˆμŠ€ν„°ν•˜κΈ°

by YJ Dev 2024. 5. 8.
728x90
λ°˜μ‘ν˜•
SMALL

μ˜ˆμ™Έ μ²˜λ¦¬λŠ” ν”„λ‘œκ·Έλž˜λ°μ—μ„œ ν•„μˆ˜μ μΈ μš”μ†Œμž…λ‹ˆλ‹€. μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ λ°œμƒν•  수 μžˆλŠ” 예기치 μ•Šμ€ 상황에 λŒ€λΉ„ν•˜λŠ” 것은 μ•ˆμ •μ„±κ³Ό 신뒰성을 λ†’μ΄λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” pythonμ—μ„œμ˜ μ˜ˆμ™Έ μ²˜λ¦¬μ— λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

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


1. μ˜ˆμ™Έμ˜ μ’…λ₯˜πŸΆ

β–Ά SyntaxError: 파이썬 μ½”λ“œκ°€ μ˜¬λ°”λ₯Έ 문법에 λ§žμ§€ μ•Šμ•„ λ°œμƒν•˜λŠ” 였λ₯˜μž…λ‹ˆλ‹€.

print('test)  # λ”°μ˜΄ν‘œκ°€ λ‹«νžˆμ§€ μ•ŠμŒ
print('Hello'))  # κ΄„ν˜Έκ°€ ν•œ 쌍 더 많음


β–Ά NameError:
μ •μ˜λ˜μ§€ μ•Šμ€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λ €κ³  ν•  λ•Œ λ°œμƒν•˜λŠ” 였λ₯˜μž…λ‹ˆλ‹€.

a = 10
b = 15
print(c)


β–Ά ZeroDivisionError :
0으둜 λ‚˜λˆ„λ €κ³  ν•  λ•Œ λ°œμƒν•˜λŠ” 였λ₯˜μž…λ‹ˆλ‹€.

print(10 / 0)


β–ΆIndex Error:
μ‹œν€€μŠ€μ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚œ 인덱슀λ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•  λ•Œ λ°œμƒν•˜λŠ” 였λ₯˜μž…λ‹ˆλ‹€.

x = [1, 2, 3]
print(x[3])

β–ΆKeyError: μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν‚€λ₯Ό λ”•μ…”λ„ˆλ¦¬μ—μ„œ μ°Έμ‘°ν•˜λ €κ³  ν•  λ•Œ λ°œμƒν•˜λŠ” 였λ₯˜μž…λ‹ˆλ‹€.

dic = {'name':'홍길동', 'age':20}
print(dic['hobby']) # μ—λŸ¬
print(dic.get('hobby')) # μ—λŸ¬ μ•ˆλ‚˜κ³  None을 λ°˜ν™˜

β–ΆValueError: ν•¨μˆ˜λ‚˜ 연산에 μ „λ‹¬λœ 인자의 값이 μœ νš¨ν•˜μ§€ μ•Šμ„ λ•Œ λ°œμƒν•˜λŠ” 였λ₯˜μž…λ‹ˆλ‹€.

x = [1, 4, 10]
x.remove(100) # κ°’ 100 제거 -> 였λ₯˜

β–ΆTypeError: 잘λͺ»λœ μžλ£Œν˜•μœΌλ‘œ μˆ˜ν–‰λœ μ—°μ‚°μ΄λ‚˜ ν•¨μˆ˜ 호좜둜 인해 λ°œμƒν•˜λŠ” 였λ₯˜μž…λ‹ˆλ‹€.

x = [1, 2] # 리슀트
y = (1, 2) # νŠœν”Œ
z = 'Hello' # λ¬Έμžμ—΄
print(x + y + z) # μ„œλ‘œ λ‹€λ₯Έ μžλ£Œν˜•μ΄κΈ° λ•Œλ¬Έμ— 성립 μ•ˆ 됨

2. λͺ¨λ“  μ˜ˆμ™Έ 처리 (try - except)🐯

try-except 문은 μ˜ˆμ™Έ 처리λ₯Ό μœ„ν•œ 파이썬의 기본적인 κ΅¬λ¬Έμž…λ‹ˆλ‹€. 이 ꡬ문은 μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλŠ” μ½”λ“œ 블둝을 try 블둝 μ•ˆμ— λ„£κ³ , μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ μ²˜λ¦¬ν•  μ½”λ“œλ₯Ό except 블둝에 λ„£μŠ΅λ‹ˆλ‹€. try 블둝 λ‚΄μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ νŒŒμ΄μ¬μ€ ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ except λΈ”λ‘μœΌλ‘œ μ΄λ™ν•©λ‹ˆλ‹€. try-except ꡬ문을 μ‚¬μš©ν•˜λ©΄ μ˜ˆμ™Έκ°€ λ°œμƒν•  수 μžˆλŠ” 뢀뢄을 κ°μ‹Έμ„œ ν”„λ‘œκ·Έλž¨μ΄ μ€‘λ‹¨λ˜λŠ” 것을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€. μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜λŠ” 것을 막고, λŒ€μ‹ μ— μ‚¬μš©μžκ°€ μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, νŒŒμΌμ„ μ—΄ λ•Œ ν•΄λ‹Ή 파일이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ— λŒ€λΉ„ν•˜μ—¬ try-except ꡬ문을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. try λΈ”λ‘μ—μ„œ νŒŒμΌμ„ μ—΄λ €κ³  μ‹œλ„ν•˜κ³ , 파일이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ λ°œμƒν•˜λŠ” FileNotFoundError μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

try:
    with open('nonexistent_file.txt', 'r') as file:
        content = file.read()
    print("파일 λ‚΄μš©:", content)
except FileNotFoundError:
    print("νŒŒμΌμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.")


μ΄λ ‡κ²Œ ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ FileNotFoundErrorλ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•Šκ³  μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λŒ€μ‹ μ— νŒŒμΌμ„ 찾을 수 μ—†λ‹€λŠ” λ©”μ‹œμ§€λ₯Ό μ‚¬μš©μžμ—κ²Œ 보여쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

try:
    num = int(input('μ •μˆ˜λ₯Ό μž…λ ₯ν•˜μ„Έμš”: '))
    print('μ›μ˜ λ°˜μ§€λ¦„: {}'.format(num))
    print('μ›μ˜ λ‘˜λ ˆ: {}'.format(num * 3.14 * 2))
    print('μ›μ˜ 넓이: {}'.format(num * num * 3.14))
except:
    print('μž…λ ₯ν•œ 값이 μ˜¬λ°”λ₯Έ μ •μˆ˜κ°€ μ•„λ‹™λ‹ˆλ‹€.')


μœ„ μ½”λ“œλŠ” μ‚¬μš©μžλ‘œλΆ€ν„° μ •μˆ˜λ₯Ό μž…λ ₯λ°›μ•„ μ›μ˜ λ°˜μ§€λ¦„μœΌλ‘œ μ‚¬μš©ν•˜κ³ , 이λ₯Ό μ΄μš©ν•˜μ—¬ μ›μ˜ λ‘˜λ ˆμ™€ 넓이λ₯Ό κ³„μ‚°ν•˜μ—¬ 좜λ ₯ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€. μ‚¬μš©μžκ°€ μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ 값을 μž…λ ₯ν•  경우 ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ§€ μ•Šκ³ , λŒ€μ‹ μ— 였λ₯˜ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ μ μ ˆν•œ μ•ˆλ‚΄λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

try:
    height = input('ν‚€λ₯Ό μž…λ ₯ν•˜μ„Έμš” >>> ')
    height = round(height)  # 반올림 ν•¨μˆ˜μ— λ¬Έμžμ—΄μ΄ μ „λ‹¬λ˜μ–΄ μ˜ˆμ™Έ λ°œμƒ
    print('μž…λ ₯ν•˜μ‹  ν‚€λŠ” {}cm둜 μ²˜λ¦¬λ©λ‹ˆλ‹€.'.format(height))
except:
    print('μž…λ ₯ν•œ κ°’μ˜ ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.')


μœ„ μ½”λ“œλŠ” μ‚¬μš©μžλ‘œλΆ€ν„° ν‚€λ₯Ό μž…λ ₯λ°›μ•„ μ†Œμˆ˜μ  μ΄ν•˜λ₯Ό λ°˜μ˜¬λ¦Όν•˜μ—¬ μ²˜λ¦¬ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€. 이 μ½”λ“œλ₯Ό μ‹€ν–‰ν•  λ•Œ μ‚¬μš©μžκ°€ μˆ«μžκ°€ μ•„λ‹Œ 값을 μž…λ ₯ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ λΉ„μ •μƒμ μœΌλ‘œ μ’…λ£Œλ˜μ§€ μ•Šκ³ , λŒ€μ‹ μ— μ˜ˆμ™Έκ°€ μ²˜λ¦¬λ˜μ–΄ 였λ₯˜ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.
except λΈ”λ‘μ—μ„œ μ˜ˆμ™Έ 객체λ₯Ό λ°›μ•„μ˜¨ ν›„, ν•΄λ‹Ή 객체λ₯Ό 좜λ ₯ν•˜κ±°λ‚˜ κ·Έ μ•ˆμ— ν¬ν•¨λœ 정보λ₯Ό ν™œμš©ν•¨μœΌλ‘œμ¨ μ˜ˆμ™Έ λ©”μ‹œμ§€λ₯Ό μ²˜λ¦¬ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ˜ˆμ™Έ 객체 μ•ˆμ— μžˆλŠ” λ©”μ‹œμ§€κ°€ 좜λ ₯λ˜μ–΄ ν•΄λ‹Ή μ˜ˆμ™Έκ°€ μ–΄λ–€ λ‚΄μš©μœΌλ‘œ λ°œμƒν–ˆλŠ”μ§€ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

a = [10, 20, 30, 40, 50]

try:
    print(a[10])

except IndexError as e:
    # μ˜ˆμ™Έ 객체 e의 λ‚΄μš©μ„ 좜λ ₯
    print("μ˜ˆμ™Έ λ©”μ‹œμ§€:", e)

3.νŠΉμ • μ˜ˆμ™Έ μ²˜λ¦¬πŸ¦“

νŠΉμ • μ˜ˆμ™Έλ§Œ μ²˜λ¦¬ν•˜λŠ” 방식은 expect 블둝을 μ‚¬μš©ν•˜μ—¬ 각각의 μ˜ˆμ™Έμ— λŒ€ν•΄ λ³„λ„λ‘œ μ²˜λ¦¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 방식을 μ‚¬μš©ν•˜λ©΄ 각각의 μ˜ˆμ™Έμ— λŒ€ν•΄ ꡬ체적으둜 μ²˜λ¦¬ν•  수 μžˆμ–΄ 가독성이 높아지고, μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ„±λ„ μ’‹μ•„μ§‘λ‹ˆλ‹€.

try:
    a = int(input('제수λ₯Ό μž…λ ₯ν•˜μ„Έμš”: '))
    b = int(input('ν”Όμ œμˆ˜λ₯Ό μž…λ ₯ν•˜μ„Έμš”: '))
    result = a / b
    print('{} / {} = {}'.format(a, b, result))

except ZeroDivisionError:
    print('0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.')

except ValueError:
    print('μ •μˆ˜λ§Œ μž…λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.')


예λ₯Ό λ“€μ–΄, νŒŒμ΄μ¬μ—μ„œ 0으둜 λ‚˜λˆ„λŠ” 경우 ZeroDivisionError 와 μ •μˆ˜λ‘œ λ³€ν™˜ν•  수 μ—†λŠ” 경우 ValueError에 λŒ€ν•΄ 각각 λ‹€λ₯Έ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜κ³ μž ν•œλ‹€λ©΄, λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ ZeroDivisionErrorκ°€ λ°œμƒν•˜λ©΄ "0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€."κ°€ 좜λ ₯되고, ValueErrorκ°€ λ°œμƒν•˜λ©΄ "μ •μˆ˜λ§Œ μž…λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€."κ°€ 좜λ ₯λ©λ‹ˆλ‹€. λ‹€λ₯Έ μ˜ˆμ™Έκ°€ λ°œμƒν•œ κ²½μš°λŠ” 이 except 블둝에 ν•΄λ‹Ήν•˜μ§€ μ•ŠμœΌλ―€λ‘œ ν•΄λ‹Ή μ˜ˆμ™ΈλŠ” μƒμœ„ λΈ”λ‘μ—μ„œ μ²˜λ¦¬λ©λ‹ˆλ‹€.


4. else 문과 finally문🦊

else와 finally 블둝은 μ˜ˆμ™Έ μ²˜λ¦¬μ— μ‚¬μš©λ˜λŠ” 두 가지 보쑰 λΈ”λ‘μž…λ‹ˆλ‹€.

β–Άelse 블둝:

  • try 블둝 μ•ˆμ˜ μ½”λ“œκ°€ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•Šμ•˜μ„ λ•Œ μ‹€ν–‰λ˜λŠ” λΈ”λ‘μž…λ‹ˆλ‹€.
  • μ–΄λ–€ μ˜ˆμ™Έλ„ λ°œμƒν•˜μ§€ μ•Šμ•˜μ„ λ•Œ μ‹€ν–‰ν•  μ½”λ“œλ₯Ό else 블둝에 μž‘μ„±ν•©λ‹ˆλ‹€.
  • elseλŠ” λ°˜λ“œμ‹œ except 뒀에 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

β–Άfinally 블둝:

  • try 블둝 μ•ˆμ˜ μ½”λ“œ μ‹€ν–‰ 여뢀와 관계없이 항상 μ‹€ν–‰λ˜λŠ” λΈ”λ‘μž…λ‹ˆλ‹€.
  • 주둜 λ¦¬μ†ŒμŠ€λ₯Ό μ •λ¦¬ν•˜κ±°λ‚˜ 정리 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
  • tryλŠ” λ‹¨λ…μœΌλ‘œ μ‚¬μš©ν•  수 μ—†μœΌλ©°, λ°˜λ“œμ‹œ except λ˜λŠ” finally ꡬ문과 ν•¨κ»˜ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
try: # μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œ
	filename = input('μ—΄κ³ μž ν•˜λŠ” 파일λͺ…을 μž…λ ₯ν•˜μ„Έμš” >>> ')
	file = open(filename,'rt') # 파일 μ—΄κΈ°
    
except FileNotFoundError: # μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ μ‹€ν–‰
	print('{} 파일이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.'.format(filename))
    
else: # μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜μ„ λ•Œ (정상적)
	buffer = file.read()
	print(buffer)
	file.close() # 파일 λ‹«κΈ°
    
finally:
	print('ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€!')


try 블둝 μ•ˆμ—λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œκ°€ λ“€μ–΄κ°‘λ‹ˆλ‹€. 이 경우 μ‚¬μš©μžλ‘œλΆ€ν„° 파일λͺ…을 μž…λ ₯λ°›κ³ , ν•΄λ‹Ή νŒŒμΌμ„ μ—΄λ €κ³  μ‹œλ„ν•©λ‹ˆλ‹€. except FileNotFoundError λŠ” νŒŒμΌμ„ 찾을 수 μ—†λŠ” 경우 λ°œμƒν•˜λŠ” μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. 이 경우 파일이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€. else 블둝은 μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜μ„ λ•Œ μ‹€ν•΄μ˜€λ””λŠ” λΈ”λ‘μž…λ‹ˆλ‹€. νŒŒμΌμ„ μ„±κ³΅μ μœΌλ‘œ μ—΄μ—ˆλ‹€λ©΄ 파일의 λ‚΄μš©μ„ 읽고 좜λ ₯ν•©λ‹ˆλ‹€. 그리고 νŒŒμΌμ„ λ‹«μŠ΅λ‹ˆλ‹€. finally 블둝은 μ˜ˆμ™Έ 여뢀와 관계없이 항상 μ‹€ν–‰λ˜λŠ” λΈ”λ‘μž…λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜κΈ° 전에 μ‹€ν–‰λ˜λ©°, μ—¬κΈ°μ„œλŠ” "ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€!" λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.


5. κ°•μ œλ‘œ μ˜ˆμ™Έ λ°œμƒμ‹œν‚€κΈ°πŸ²

κ°•μ œλ‘œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” 것은 ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ½”λ“œμ˜ νŠΉμ • μƒν™©μ—μ„œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” 것을 λ§ν•©λ‹ˆλ‹€. μ΄λŠ” ν”„λ‘œκ·Έλž¨μ˜ νŠΉμ • 쑰건이 μΆ©μ‘±λ˜μ§€ μ•Šμ•˜κ±°λ‚˜ μ˜ˆμƒμΉ˜ λͺ»ν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμ„ λ•Œ, λͺ…μ‹œμ μœΌλ‘œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œμΌœ 이λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. νŒŒμ΄μ¬μ—μ„œλŠ” raise ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ˜ˆμ™Έλ₯Ό κ°•μ œλ‘œ λ°œμƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. raise ν‚€μ›Œλ“œλŠ” λ‹€μŒκ³Ό 같이 μ‚¬μš©λ©λ‹ˆλ‹€.

raise μ˜ˆμ™Έν΄λž˜μŠ€(μ˜ˆμ™Έλ©”μ‹œμ§€)


μ—¬κΈ°μ„œ μ˜ˆμ™Έν΄λž˜μŠ€λŠ” λ°œμƒμ‹œν‚€κ³ μž ν•˜λŠ” μ˜ˆμ™Έμ˜ 클래슀λ₯Ό λ‚˜νƒ€λ‚΄λ©° μ˜ˆμ™Έλ©”μ„Έμ§€λŠ” λ°œμƒν•œ μ˜ˆμ™Έμ— λŒ€ν•œ μ„€λͺ…을 ν¬ν•¨ν•œ λ¬Έμžμ—΄μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯을 λ°›μ•„ μŒμˆ˜κ°€ μž…λ ₯λ˜μ—ˆμ„ λ•Œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” 경우λ₯Ό 생각해 λ΄…μ‹œλ‹€. μ΄λ•Œ ValueError μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€κ³  μ‚¬μš©μžμ—κ²Œ 음수λ₯Ό μž…λ ₯ν•˜μ§€ λ§λΌλŠ” λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

num = int(input("μ–‘μˆ˜λ₯Ό μž…λ ₯ν•˜μ„Έμš”: "))
if num < 0:
    raise ValueError("μŒμˆ˜λŠ” μž…λ ₯ν•  수 μ—†μŠ΅λ‹ˆλ‹€.")


μ΄λ ‡κ²Œ ν•˜λ©΄ μ‚¬μš©μžκ°€ 음수λ₯Ό μž…λ ₯ν•  경우 ValueError μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©°, ν•΄λ‹Ή μ˜ˆμ™Έμ—λŠ” "μŒμˆ˜λŠ” μž…λ ₯ν•  수 μ—†μŠ΅λ‹ˆλ‹€."λΌλŠ” 메세지가 ν¬ν•¨λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 방식을 μ‚¬μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ˜ˆμƒμΉ˜ λͺ»ν•œ 쑰건에 μ§λ©΄ν–ˆμ„ λ•Œ, ν•΄λ‹Ή 상황을 λͺ…ν™•ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


pass ν‚€μ›Œλ“œλŠ” μ˜ˆμ™Έ μ²˜λ¦¬μ—μ„œ 주둜 μ‚¬μš©λ˜λ©°, νŠΉμ • μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμ„ λ•Œ μ•„λ¬΄λŸ° λ™μž‘μ„ ν•˜μ§€ μ•Šκ³  κ·Έλƒ₯ λ„˜μ–΄κ°€λŠ” 역할을 ν•©λ‹ˆλ‹€. μ˜ˆμ™Έ 처리 κ΅¬λ¬Έμ—μ„œλŠ” νŠΉμ • μ˜ˆμ™Έμ— λŒ€ν•œ 처리 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•˜μ§€λ§Œ, λ•Œλ‘œλŠ” 아직 ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•  ꡬ체적인 λ‚΄μš©μ΄ 없을 λ•Œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이런 κ²½μš°μ— passλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό λ„˜μ–΄κ°€κ³  λ‹€μŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ ν”„λ‘œκ·Έλž¨μ΄ λ©ˆμΆ”μ§€ μ•Šκ³  계속 싀행될 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 μ˜ˆμ™Έ 처리 κ΅¬λ¬Έμ—μ„œ passλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

try:
    # μ–΄λ–€ μž‘μ—…μ„ μ‹œλ„
except SomeException:
    # 아직 μ²˜λ¦¬ν•  λ‚΄μš©μ΄ 없을 λ•Œ passλ₯Ό μ‚¬μš©ν•˜μ—¬ μ˜ˆμ™Έλ₯Ό λ¬΄μ‹œν•˜κ³  λ‹€μŒ μ½”λ“œλ₯Ό 싀행함
    pass


μœ„ μ½”λ“œμ—μ„œλŠ” SomeException 이 λ°œμƒν–ˆμ„ λ•Œ μ•„λ¬΄λŸ° 처리λ₯Ό ν•˜μ§€ μ•Šκ³  κ·Έλƒ₯ λ„˜μ–΄κ°€λŠ” 역할을 ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ˜ˆμ™Έ 처리 μ½”λ“œλ₯Ό λ‚˜μ€‘μ— κ΅¬ν˜„ν•  수 있으며, μΌμ‹œμ μœΌλ‘œ μ˜ˆμ™Έλ₯Ό λ¬΄μ‹œν•˜κ³ μž ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. λ”°λΌμ„œ κ°•μ œλ‘œ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€λŠ” λΆ€λΆ„μ—μ„œ pass ν‚€μ›Œλ“œλŠ” 아직 μ²˜λ¦¬ν•  μ˜ˆμ™Έ 상황이 없을 λ•Œ μ‚¬μš©ν•  수 μžˆλŠ” 방법 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.


6. μ‚¬μš©μž μ˜ˆμ™Έ ν΄λž˜μŠ€πŸ™‰

μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ ν΄λž˜μŠ€λŠ” νŒŒμ΄μ¬μ—μ„œ κΈ°μ‘΄ μ˜ˆμ™Έ 클래슀λ₯Ό ν™•μž₯ν•˜κ±°λ‚˜ μƒˆλ‘œμš΄ μ˜ˆμ™Έ 클래슀λ₯Ό μ •μ˜ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” μžμ‹ λ§Œμ˜ μ˜ˆμ™Έ μœ ν˜•μ„ μ •μ˜ν•˜κ³ , ν”„λ‘œκ·Έλž¨μ—μ„œ ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ 클래슀λ₯Ό μ •μ˜ν•˜λŠ” μ£Όμš” λͺ©μ μ€ ν”„λ‘œκ·Έλž¨μ˜ 가독성과 μœ μ§€ λ³΄μˆ˜μ„±μ„ ν–₯μƒν‚€λŠ” 데 μžˆμŠ΅λ‹ˆλ‹€.
μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ 클래슀λ₯Ό μ •μ˜ν•˜λ €λ©΄ 파이썬의 λ‚΄μž₯ μ˜ˆμ™Έ 클래슀λ₯Ό 상속받아 μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€. 일반적으둜 μ˜ˆμ™Έ 클래슀 이름은 Exception 클래슀λ₯Ό μƒμ†λ°›μŠ΅λ‹ˆλ‹€. μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ ν΄λž˜μŠ€λŠ” λ‹€μŒκ³Ό 같은 λ°©μ‹μœΌλ‘œ μ •μ˜λ©λ‹ˆλ‹€.

class CustomError(Exception):
    def __init__(self, message):
        self.message = message
        super().__init__(self.message)


μœ„ μ½”λ“œμ—μ„œ CustomError λΌλŠ” μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ 클래슀λ₯Ό μ •μ˜ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 ν΄λž˜μŠ€λŠ” λ‚΄μž₯ μ˜ˆμ™Έ 클래슀인 Exception을 μƒμ†λ°›μŠ΅λ‹ˆλ‹€. 그리고 __init__ λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜μ—¬ μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ 객체λ₯Ό 생성할 λ•Œ λ©”μ‹œμ§€λ₯Ό 받도둝 κ΅¬ν˜„ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ΅¬ν˜„μ„ 톡해 μ‚¬μš©μžλŠ” μ˜ˆμ™Έ 객체λ₯Ό 생성할 λ•Œ λ©”μ‹œμ§€λ₯Ό ν•¨κ»˜ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.
μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” μ˜ˆμ‹œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

class CustomError(Exception):
    def __init__(self, message):
        self.message = message
        super().__init__(self.message)

try:
    raise CustomError("μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.")
except CustomError as e:
    print("λ°œμƒν•œ μ˜ˆμ™Έ λ©”μ‹œμ§€:", e.message)


μœ„ μ½”λ“œμ—μ„œ CustomError μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€κ³ , κ·Έ μ˜ˆμ™Έλ₯Ό except λΈ”λ‘μ—μ„œ μž‘μ•„μ„œ μ²˜λ¦¬ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ •μ˜ν•œ μ˜ˆμ™Έ 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ μ˜ˆμ™Έλ₯Ό λ°œμƒμ‹œν‚€κ³ , 그에 λ”°λ₯Έ 처리λ₯Ό ν•  수 있게 λ©λ‹ˆλ‹€.


7. ν•΅μ‹¬λ‚΄μš©πŸ‘€

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

728x90
λ°˜μ‘ν˜•
LIST