파이썬의 예외 처리 기법은 Java와 매우 비슷하다. 다만, Java에서는 try-catch문을 사용하지만, 파이썬에서는 try-except문을 사용한다. 이름만 다를 뿐 역할은 동일하다.
① try-except
try:
...
except:
...
② 발생 오류를 정의한 경우
try:
...
except 발생오류:
...
③ 발생 오류와 오류 변수를 포함하는 경우
try:
...
except 발생오류 as 오류변수:
...
try:
4 / 0
except ZeroDivisionError as e:
print(e)
파이썬의 finally 역시 Java의 finally와 동일하기 때문에 자세한 설명은 생략하기로 한다.
try:
f = open('foo.txt', 'w')
# 무언가를 수행한다.
finally:
f.close() # 중간에 오류가 발생하더라도 무조건 실행된다.
try-else는 파이썬에서 추가된 문법이다. try문을 실행하다 에러가 발생하면, except 블록으로 이동하고, 에러가 발생하지 않으면, else 블록이 실행된다.
try:
age=int(input('나이를 입력하세요: '))
except:
print('입력이 정확하지 않습니다.')
else:
if age <= 18:
print('미성년자는 출입금지입니다.')
else:
print('환영합니다.')
Java의 throw와 같은 기능으로 파이썬에서는 raise를 사용한다.
class Bird:
def fly(self):
raise NotImplementedError
위 예시는 자식 클래스의 fly 함수 구현을 강제하고 있는 것이다. 물론, 추상클래스로 정의하는 것이 더 일반적이긴 하나, 위와 같이 구현을 강제하는 경우도 간혹 있다.
파이썬의 예외 클래스는 Java와 마찬가지로 모두 내장 예외 클래스인 Exception 클래스를 상속받아 정의된다. 파이썬은 다양한 내장 예외 클래스를 제공하는데, 대표적인 5가지 예외만 설명하기로 한다.
① ZeroDivisionError
② TypeError
③ ValueError
④ IndexError
⑤ FileNotFoundError
사용자 정의 예외 역시 Exception 클래스를 상속하여 만든다.
class MyError(Exception):
pass
이제 사용자 정의 예외를 발생시켜보자.
def say_nick(nick):
if nick == '바보':
raise MyError()
print(nick)
say_nick("천사")
say_nick("바보")
say_nick("바보")가 실행되는 시점에서 예외가 발생한다. 하지만 예외를 발생시키는 것으로 함수를 종료시키면, 그냥 에러가 나는 것과 별반 다를게 없다. 프로그래머는 예외를 처리하여 사용자로 하여금 왜 에러가 발생한 것인지를 이해시켜주어야 한다. 그러므로 아래와 같이 발생한 예외를 처리까지 해주어야 한다.
try:
say_nick("천사")
say_nick("바보")
except MyError as e:
print(e)
그런데 사실 위와 같이 print 함수로 예외를 처리하는은 경우, 예외 클래스에 __str__ 메서드를 먼저 구현해야 한다. 아래와 같이 __str__ 메서드를 정의하면, print문으로 오류 메시지를 출력할 수 있다.
class MyError(Exception):
def __str__(self):
return "허용되지 않는 별명입니다."
내장 함수란, 별도의 import 없이 사용할 수 있는 함수로, print, del, type 등이 있다. 내장 함수의 종류는 매우 다양한데, 이 모든 걸 외워야한다는 느낌으로 보기보다는 한 번 봐둔다는 느낌으로 보고 넘기면 될 것 같다.
① abs
>>> abs(-3)
3
>>> abs(-1.2)
1.2
② divmod
>>> divmod(7, 3)
(2, 1)
③ hex
>>> hex(234)
'0xea'
④ int
>>> int('3')
3
>>> int(3.4)
3
⑤ max/min
>>> max([1, 2, 3])
3
>>> min([1, 2, 3])
1
>>> min("python")
'h'
⑥ oct
>>> oct(34)
'0o42'
⑦ pow
>>> pow(2, 4)
16
⑧ range
>>> list(range(5))
[0, 1, 2, 3, 4]
>>> list(range(5, 10))
[5, 6, 7, 8, 9]
>>> list(range(1, 10, 2))
[1, 3, 5, 7, 9]
⑨ round
>>> round(4.6)
5
>>> round(5.678, 2)
5.68
⑩ sum
>>> sum([1,2,3])
6
① all
>>> all([1, 2, 3])
True
>>> all([1, 2, 3, 0])
False
※ iterable data-set
리스트, 튜플, 문자열, 딕셔너리, 집합 등을 이르는 말로, 우리 말로는 순회 가능한 자료 집합이라 한다. 즉, 응용 for문을 사용할 수 있는 데이터 셋이다.
② any
>>> any([1, 2, 3, 0])
True
>>> any([0, ""])
False
③ filter
def positive(x):
return x > 0
print(list(filter(positive, [1, -3, 2, 0, -5, 6])))
[1, 2, 6]
>>> list(filter(lambda x: x > 0, [1, -3, 2, 0, -5, 6]))
[1, 2, 6]
④ isinstance
>>> a = Person()
>>> isinstance(a, Person)
True
① chr
>>> chr(97)
'a'
② ord
>>> ord('a')
97
③ eval
>>> eval('1+2')
3
>>> eval("'hi' + 'a'")
'hia'
>>> eval('divmod(4, 3)')
(1, 1)
④ str
>>> str(3)
'3'
① dir
>>> dir([1, 2, 3])
['append', 'count', 'extend', 'index', 'insert', 'pop',...]
② enumerate
>>> for i, name in enumerate(['body', 'foo', 'bar']):
... print(i, name)
...
0 body
1 foo
2 bar
③ list
>>> list("python")
['p', 'y', 't', 'h', 'o', 'n']
④ tuple
>>> tuple([1, 2, 3])
(1, 2, 3)
⑤ map
>>> def two_times(x):
... return x*2
...
>>> list(map(two_times, [1, 2, 3, 4]))
[2, 4, 6, 8]
⑥ sorted
>>> sorted([3, 1, 2])
[1, 2, 3]
⑦ zip
>>> list(zip([1, 2, 3], [4, 5, 6]))
[(1, 4), (2, 5), (3, 6)]
>>> list(zip([1, 2, 3], [4, 5]))
[(1, 4), (2, 5)]
① id
>>> id(a)
135072304
② type
>>> type("abc")
<class 'str'>