try,except,else,finally
import sys
try:
a = 1 / 0
print('123')
except (IOError, OSError) as err:
print(err)
except:
print("Unexpected error:", sys.exc_info()[0]) # (<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero'), <traceback object at 0x0320A828>)
else:
print('successfully.')
finally:
print('I don\'t care~')
Unexpected error: <class 'ZeroDivisionError'>
I don't care~
其中ZeroDivisionError
的sys.exc_info()
为元组:
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero'), <traceback object at 0x0359A848>)
except ZeroDivisionError as err:
中的err为异常信息
抛出异常
raise
可以抛出异常,如果有except
,except
内的代码会处理被抛出的异常。
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
x = 10
if x > 5:
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
An exception flew by!
Traceback (most recent call last):
File "E:/Code/python_test/test.py", line 13, in <module>
raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
Exception: x 不能大于 5。x 的值为: 10
如果你只想知道这是否抛出了一个异常,并不想去处理它,那么可以用raise
再次把它抛出:
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
raise # 如果你不想处理,可以再用一个raise抛出(程序会终止)
An exception flew by!
Traceback (most recent call last):
File "E:/Code/python_test/test.py", line 5, in <module>
raise NameError('HiThere')
NameError: HiThere
用户自定义异常
定义清理行为
finally
子句定义了无论在任何情况下都会执行的清理行为。
如果一个异常在try
子句里(或者在 except
和else
子句里)被抛出,而又没有任何的 except
把它截住,那么这个异常会在 finally
子句执行后被抛出。
>>>def divide(x, y):
try:
result = x / y
except ZeroDivisionError:
print("division by zero!")
else:
print("result is", result)
finally:
print("executing finally clause")
>>> divide(2, 1)
result is 2.0
executing finally clause
>>> divide(2, 0)
division by zero!
executing finally clause
>>> divide("2", "1")
executing finally clause
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'
预定义的清理行为
关键词 with
语句可以保证清理工作:
with open("myfile.txt") as f:
for line in f:
print(line, end="")
以上这段代码执行完毕后,就算在处理过程中出问题了,文件f
总是会关闭。