Python有两种错误,一种是语法错误,一种是异常
语法错误也称为解析错误,是在语句或表达式上的语法错误
异常是在执行期间检测的错误,可以被捕捉并在程序中处理
>>> while True:
... try:
... x = int(input("Please enter a number: "))
... break
... except ValueError:
... print("Oops! That was no valid number. Try again...")
raise语句可以强行引发一个指定的异常
>>> raise NameError('xixi')
raise Exception([value])
raise的引发的异常必须为一个异常实例或异常类,value是一个说明异常细节的可选值
>>> raise Exception('xix','haha')
Traceback (most recent call last):
File "", line 1, in
Exception: ('xix', 'haha')
如果需要引发异常,但不打算处理它,raise语句后不带任何参数,则会再次引发上一个异常
>>> try:
... raise ValueError
... except ValueError:
... print("将会再次引发异常")
... raise
...
将会再次引发异常
Traceback (most recent call last):
File "", line 2, in
ValueError
try语句可能有多个except子句,以指定不同的异常处理程序,但是最多有一个处理程序会被执行
except 语句可以将多个异常包装为元组来捕捉
except语句可以使用as 限定符来为异常提供一个变量名称
except语句如果不带任何异常类型,将捕捉所有异常
try:
...
except (IOError, TypeError) as e: #同时捕捉多个异常
...
except ValueError as e: #为异常起一个名字
...
except NameError:
pass
except : #捕捉所有异常
...
raise
也可以使用pass语句来忽略异常
首先,执行try子句中代码块
如果为发生任何异常忽略,except子句
如果try代码块发生异常,则跳过该子句其余部分
如果由except捕捉,则执行该except子句的代码,然后继续执行try...except语句后的代码
如果没有被捕捉,则传递给上层代码(try语句可能会被包括再上层try语句中),当传递到程序的最顶层依然为被捕捉,它就成为一个未处理异常,程序会终止运行并显示一条如上所示的信息。
因此异常处理程序,不仅能处理再try子句中直接引发的异常,也能处理在try子句中调用的函数发生的异常
try...except语句还有一个可选的else子句,该子句必须放在所有except子句后面
如果try代码块中代码不引发异常,则执行else子句的代码
try:
...
except:
...
else:
print("no exception")
finally子句提供了无论是否出现异常都必须执行的代码
如果try子句中引发异常,并且没有except子句捕捉处理或异常发生在except或else子句中,那么在执行完finally子句后将重新引发这个异常
try语句由break,continue,return语句离开时同样会执行finally语句
可以使用finally子句来释放外部资源,例如文件和网络连接,无论资源是否被成功使用
f = open('a','r')
try:
...
finally:
f.close()
Exception所有的非退出类异常的基类
GeneratorExit有生成器的.close()方法引发
KeyborderInterrupt由键盘中断引发,通常为Ctrl+C
SystemExit 程序退出/终止
可以通过使用Exception来捕捉除与程序退出相关异常之外的所有异常
try:
...
except Exception as e:
print('An error occurred : %s \n' % e)
不过捕捉所有Exception异常可能会无法报告准确的信息,影响程序的调试
except语句可以不带任何异常,这样可以作为通配符来捕获所有异常
最好在处理完异常后再重新提出异常,来允许调用者处理异常
try:
...
raise KeybordInterrupt
except:
print('捕捉到异常')
raise
except子句中使用as var为异常指定的名称变量,这个变量会绑定到一个异常实例,同时异常的参数将存放到实例args中
异常实例定义了__str__(),因此异常的参数可以直接打印
>>> try:
... raise Exception('spam', 'eggs')
... except Exception as e:
... print(type(e)) # the exception instance
... print(e.args) # arguments stored in .args
... print(e) # __str__ allows args to be printed directly,
... # but may be overridden in exception subclasses
... x, y = e.args # unpack args