프로그램 실행중에 오류(error)가 발생하면 예외(exception) 상태로 전환된다. 예외 상태로 전환되면 실행중이던 프로그램을 멈추고 발생한 오류를 알려준다. 즉, 예외는 오류를 처리하는 방식이며, C 언어에서는 존재하지 않는다.
예외 처리와 관련해서 다룰 내용은 다음과 같다.
try ... except ...
명령어를 이용하여 예외 처리하기raise
명령어를 이용하여 예외 발생시키기
In [1]:
4.5 / 0
In [2]:
print(abc)
In [3]:
f = open('not_yet_defined_file.txt', 'r')
In [4]:
l = range(3)
l[3]
In [5]:
def my_complicated_function():
"""아주 복잡하지만 지금 당장 불필요"""
raise NotImplementedError("아직 정의되어 있지 않음")
In [6]:
my_complicated_function()
오류 처리를 사용하지 않으면 오류 메시지가 보이지 않을 수도 있음에 주의해야 한다.
In [7]:
def my_complicated_function_1():
"""아주 복잡하지만 지금 당장 불필요"""
In [8]:
my_complicated_function_1()
아래 코드를 실행하면 두 가지 경우가 발생할 수 있다.
myfilename.dat
파일이 존재하는 경우 해당 파일을 열어 한 줄씩 보여준다.myfilename.dat
파일이 존재하지 않는 경우 아래와 같은 메시지가 보여지고 프로그램 실행이 멈춘다.
"""해당 파일을 열수 없습니다. 프로그램을 더 이상 실행할 수 없습니다.
An exception has occurred, use %tb to see the full traceback.
SystemExit: 1"""
print
문이 실행된 결과이다.sys
모듈의 exit
함수를 호출하면 프로그램이 중단된다. exit 함수가 숫자 1
을 리턴하도록 하여 문제 때문에 프로그램이 중단되었음을 알리는 기능도 예외 처리에 포함시킨 것을 알 수 있다.
In [9]:
try:
f = open('myfilename.dat', 'r')
except:
print("해당 파일을 열수 없습니다."),
print("프로그램을 더 이상 실행할 수 없습니다.")
import sys
sys.exit(1) #a way to exit the programle couldn’t be opened."),
for line in f.readlines():
print(line)
In [10]:
try:
f = open('myfilename.dat', 'r')
except IOError:
print("해당 파일을 열수 없습니다."),
print("프로그램을 더 이상 실행할 수 없습니다.")
import sys
sys.exit(1) #a way to exit the programle couldn’t be opened."),
for line in f.readlines():
print(line)
In [11]:
try:
f = open('myfilename.dat', 'r')
except IOError as er:
print("해당 파일을 열수 없습니다."),
print("프로그램을 더 이상 실행할 수 없습니다.")
print(er)
import sys
sys.exit(1) #a way to exit the programle couldn’t be opened."),
for line in f.readlines():
print(line)
In [12]:
try:
a = 1/0
except IOError:
print("The file couldn’t be opened."),
print("This program stops here.")
import sys
sys.exit(1) #a way to exit the program
In [13]:
raise NameError('HiThere')
아래 코드에서처럼 raise
함수는 에러 인자를 선택적으로 받을 수 있다.
In [14]:
try:
raise NameError('HiThere')
except NameError:
print 'An exception flew by!'
raise
스페이스로 구분된 숫자들이 저장되어 있는 파일을 인자로 받아서 각 줄별로 포함된 숫자들과 숫자들의 합을 계산하여 보여주는(print
) 함수 print_line_sum_of_file(filename)
을 작성하라.
예제:
test.txt
파일에 아래 내용이 들어 있다고 가정하면 아래 결과가 나와야 한다.
1 3 5 8
0 4 7
1 18
In [1]: print_line_sum_of_file("test.txt")
out[1]: 1 3 5 8 17
0 4 7 11
1 18 19
주의사항: 파이썬 2.7에서 print
명령은 줄바꿈을 무조거 실행하도록 설정되어 있다. 줄바꾸기를 하지 않으려면 print
명령문 뒤에 콤마를 찍어야 한다.
In [1]: print(3), ; print(4)
3 4
In [15]:
f = open("test.txt", 'w')
f.write("1 3 5 8\n0 4 7\n1 18")
f.close()
def print_line_sum_of_file(filename):
g = open("test.txt", 'r')
h = g.readlines()
g.close()
for line in h:
sum = 0
k = line.split()
for item in k:
print(item),
sum = sum + int(item)
print(sum)
print_line_sum_of_file("test.txt")
데이터 파일에 숫자가 아닌 문자열이 포함되어 있을 경우 그 문자열은 무시하도록 print_line_sum_of_file(filename)
를 수정하라.
예제:
test.txt
파일에 아래 내용이 들어 있다고 가정하면 아래 결과가 나와야 한다.
1 3 5 8
1 cat 7
coffee
In [1]: print_line_sum_of_file("test.txt")
out[1]: 1 3 5 8 17
1 cat 7 8
coffee 0
In [16]:
f = open("test.txt", 'w')
f.write("1 3 5 8\n1 cat 7\ncoffee")
f.close()
def print_line_sum_of_file(filename):
g = open("test.txt", 'r')
h = g.readlines()
g.close()
for line in h:
sum = 0
k = line.split()
for item in k:
print(item),
try:
sum = sum + int(item)
except ValueError:
pass
print(sum)
print_line_sum_of_file("test.txt")