try/except
try 语句按照如下方式工作;
首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
如果没有异常发生,忽略 except 子句,try 子句执行后结束。
如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
复制 except ( RuntimeError , TypeError , NameError ) :
pass
最后一个except子句可以忽略异常的名称,它将被当作通配符使用。你可以使用这种方法打印一个错误信息,然后再次把异常抛出。
复制 import sys
try :
f = open ( 'myfile.txt' )
s = f . readline ()
i = int (s. strip ())
except OSError as err :
print ( "OS error: {0} " . format (err))
except ValueError :
print ( "Could not convert data to an integer." )
except :
print ( "Unexpected error:" , sys. exc_info ()[ 0 ])
raise # 抛出异常
try/except...else
else 子句将在 try 子句没有发生任何异常的时候执行。
使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。
复制 for arg in sys . argv [ 1 :]:
try :
# 如果打开文件时正常的没有发生异常则执行 else 部分的语句,读取文件内容
f = open (arg, 'r' )
except IOError :
print ( 'cannot open' , arg)
else :
print (arg, 'has' , len (f. readlines ()), 'lines' )
f . close ()
try-finally
finally 语句无论是否发生异常都将执行最后的代码。
复制 try :
runoob ()
except AssertionError as error :
print (error)
else :
try :
with open ( 'file.log' ) as file :
read_data = file . read ()
except FileNotFoundError as fnf_error :
print (fnf_error)
finally :
print ( '这句话,无论异常是否发生都会执行。' )
定义清理行为
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'