νμ΄μ¬ μμΈμ²λ¦¬(Exception)μ λͺ¨λ κ²
λνμ μΈ μμΈ μν©
νν λ°μνλ μμΈμν©μ κ°λ¨ν μ΄ν΄λ³΄κ² μ΅λλ€.
- μλ νμΌ μ΄κΈ°
>>> f = open("abc.txt", 'r')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'abc.txt'
- Zero division
>>> 4 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
- index error
>>> a = [1, 2, 3]
>>> a[3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
try-except
νμ΄μ¬μμ μμΈ μ²λ¦¬λ μ½λ μ€ν μ€μ λ°μνλ μμΈλ μ€λ₯ μν©μ λμ²νκΈ° μν λ©μ»€λμ¦μ λ§ν©λλ€. μμΈλ νλ‘κ·Έλ¨μ μ μμ μΈ νλ¦μ λ°©ν΄νκ³ μ€λ₯ λ©μμ§λ₯Ό λ°μμν¬ μ μμ΅λλ€. μμΈ μ²λ¦¬λ₯Ό ν΅ν΄ μ΄λ¬ν μν©μ λμνκ³ νλ‘κ·Έλ¨μ΄ gracefulνκ² μ²λ¦¬ν μ μλλ‘ ν μ μμ΅λλ€.
μμΈ μ²λ¦¬λ try, except, else, finally λ±μ ν€μλλ₯Ό μ¬μ©νμ¬ κ΅¬νλ©λλ€.
try:
# μμΈκ° λ°μν μ μλ μ½λ λΈλ‘
# μμΈκ° λ°μνλ©΄ except λΈλ‘μΌλ‘ μ΄λ
# μμΈκ° λ°μνμ§ μμΌλ©΄ else λΈλ‘ μ€ν
except μμΈμ’
λ₯ as μμΈλ³μ:
# μμΈ μ²λ¦¬ μ½λ
# μμΈ μ’
λ₯μ λ°λΌ λ€λ₯΄κ² μ²λ¦¬ κ°λ₯
else:
# μμΈκ° λ°μνμ§ μμμ λ μ€νλλ μ½λ
finally:
# μμΈ λ°μ μ¬λΆμ μκ΄μμ΄ νμ μ€νλλ μ½λ
μμλ₯Ό ν΅ν΄ κ° λΆλΆμ μ€λͺ νκ² μ΅λλ€.
try:
# μμΈκ° λ°μν μ μλ μ½λ
x = 10 / 0 # ZeroDivisionError λ°μ
except ZeroDivisionError as e:
# ZeroDivisionErrorκ° λ°μνμ λ μ€νλλ μ½λ
print(f"Error: {e}")
else:
# μμΈκ° λ°μνμ§ μμμ λ μ€νλλ μ½λ
print("No error")
finally:
# μμΈ λ°μ μ¬λΆμ μκ΄μμ΄ νμ μ€νλλ μ½λ
print("Finally block")
μ΄ μ½λλ ZeroDivisionErrorκ° λ°μν κ²½μ° ν΄λΉ μμΈλ₯Ό μ²λ¦¬νκ³ μλ¬ λ©μμ§λ₯Ό μΆλ ₯ν©λλ€. λ§μ½ μμΈκ° λ°μνμ§ μμΌλ©΄ else λΈλ‘μ΄ μ€νλκ³ , λ§μ§λ§μΌλ‘ finally λΈλ‘μ΄ νμ μ€νλ©λλ€.
μΆκ°μ μΌλ‘, except λΈλ‘μμ μ¬λ¬ μμΈλ₯Ό μ²λ¦¬νκ±°λ λͺ¨λ μμΈλ₯Ό μ²λ¦¬νλ λ°©λ²λ μμ΅λλ€.
try:
# μμΈκ° λ°μν μ μλ μ½λ
x = 10 / 0 # ZeroDivisionError λ°μ
except (ZeroDivisionError, ValueError) as e:
# μ¬λ¬ μμΈλ₯Ό λμμ μ²λ¦¬νλ μ½λ
print(f"Error: {e}")
except Exception as e:
# λͺ¨λ μμΈλ₯Ό μ²λ¦¬νλ μ½λ
print(f"Unexpected error: {e}")
μμΈ μ²λ¦¬λ νλ‘κ·Έλ¨μ μμ μ±μ ν₯μμν€κ³ μκΈ°μΉ μμ μν©μ λμ²νλλ° μ€μν λꡬμ λλ€. νμ§λ§ λ무 λ§μ μμΈλ₯Ό λ무 μΌλ°μ μΌλ‘ μ²λ¦¬νλ κ²μ λλ²κΉ μ μ΄λ ΅κ² λ§λ€ μ μμΌλ―λ‘ μ μ€νκ² μ¬μ©ν΄μΌ ν©λλ€.
try-finally
λ³΄ν΅ try-finallyλ‘ κ΅¬μ±λ ꡬ쑰λ finally μ μμ μ¬μ©ν 리μμ€λ₯Ό closeν λ λ§μ΄ μ¬μ©λ©λλ€.
# try_finally.py
try:
f = open('foo.txt', 'w')
# 무μΈκ°λ₯Ό μννλ€.
(... μλ΅ ...)
finally:
f.close() # μ€κ°μ μ€λ₯κ° λ°μνλλΌλ 무쑰건 μ€νλλ€.
μ€λ₯ ννΌ
νΉμ μ€λ₯κ° λ°μνμ λ κ·Έλ₯ ν΅κ³ΌμμΌμΌν λλ μμ΅λλ€. κ·Έλ΄ λ passλ₯Ό μ¬μ©ν΄μ ννΌν©λλ€.
# error_pass.py
try:
f = open("λμλνμΌ", 'r')
except FileNotFoundError:
pass
try λ¬Έ μμμ FileNotFoundErrorκ° λ°μν κ²½μ°, passλ₯Ό μ¬μ©νμ¬ μ€λ₯λ₯Ό κ·Έλ₯ ννΌνλλ‘ μμ±ν μμ μ λλ€.
μ€λ₯ κ°μ λ‘ λ°μμν€κΈ°
νμ΄μ¬μ raise λͺ λ Ήμ΄λ₯Ό μ¬μ©ν΄ μ€λ₯λ₯Ό κ°μ λ‘ λ°μμν¬ μ μμ΅λλ€.
μλ₯Ό λ€μ΄ Bird ν΄λμ€λ₯Ό μμλ°λ μμ ν΄λμ€λ λ°λμ flyλΌλ ν¨μλ₯Ό ꡬννλλ‘ λ§λ€κ³ μΆμ κ²½μ°(κ°μ λ‘ κ·Έλ κ² νκ³ μΆμ κ²½μ°)κ° μμ μ μμ΅λλ€.
# error_raise.py
class Bird:
def fly(self):
raise NotImplementedError
Bird ν΄λμ€λ₯Ό μμλ°λ μμ ν΄λμ€λ λ°λμ fly ν¨μλ₯Ό ꡬνν΄μΌ νλ€λ μμ§λ₯Ό λ³΄μ¬ μ€λλ€. C++μ μμκ°μν¨μ, μλ°μ μΈν°νμ΄μ€ ν¨μμ κ°μ κ°λ μ λλ€. λ§μ½ μμ ν΄λμ€κ° fly ν¨μλ₯Ό ꡬννμ§ μμ μνλ‘ fly ν¨μλ₯Ό νΈμΆνλ€λ©΄ μ΄λ»κ² λ κΉμ?
NotImplementedErrorλ νμ΄μ¬μ μ΄λ―Έ μ μλμ΄ μλ μ€λ₯λ‘, κΌ μμ±ν΄μΌ νλ λΆλΆμ΄ ꡬνλμ§ μμμ κ²½μ° μΌλΆλ¬ μ€λ₯λ₯Ό λ°μμν€κΈ° μν΄ μ¬μ©ν©λλ€.
class Eagle(Bird):
pass
eagle = Eagle()
eagle.fly() # μ€λ₯ λ°μ
Eagle ν΄λμ€λ flyλ©μλλ₯Ό μ€λ²λΌλμ΄νμ§ μμμΌλ―λ‘ eagle.fly()λ₯Ό νΈμΆνλ μκ° NotImplementedErrorκ° λ°μν©λλ€.
컀μ€ν μμΈ λ§λ€κΈ°
νΉμν κ²½μ°, νμν κ²½μ°μ μ§μ μμΈλ₯Ό λ§λ€μ΄μ μ¬μ©ν μ μμ΅λλ€.
# error_make.py
class MyError(Exception):
pass
μμΈ ν΄λμ€λ νμ΄μ¬ λ΄μ₯ ν΄λμ€μΈ Exception ν΄λμ€λ₯Ό μμνμ¬ λ§λ€ μ μμ΅λλ€.
def say_nick(nick):
if nick == 'λ°λ³΄':
raise MyError()
print(nick)
say_nick("μ²μ¬")
say_nick("λ°λ³΄")
μ μ½λλ₯Ό μ€ννλ©΄ “μ²μ¬”κ° ν λ² μΆλ ₯λ ν MyErrorκ° λ°μν©λλ€.
μ²μ¬
Traceback (most recent call last):
File "...", line 11, in <module>
say_nick("λ°λ³΄")
File "...", line 7, in say_nick
raise MyError()
__main__.MyError
μμΈ λ΄μ©μ λλ€.
try:
say_nick("μ²μ¬")
say_nick("λ°λ³΄")
except MyError:
print("νμ©λμ§ μλ λ³λͺ
μ
λλ€.")
# μ²μ¬
# νμ©λμ§ μλ λ³λͺ
μ
λλ€.
MyErrorμ λν΄ μμΈ μ²λ¦¬ν λͺ¨μ΅μ λλ€.
μ°Έκ³ : μ ν ν¬ νμ΄μ¬