Python官⽅中⽂教程(转)6
错误异常
Python官⽅中⽂教程(转) 6
转⾃
1. 什么是异常?
在程序运⾏过程中,总会遇到各种各样的问题和错误。
有些错误是我们编写代码时⾃⼰造成的,⽐如语法错误、调⽤错误,甚⾄逻辑错误。下⾯这个例⼦,在输⼊if后输⼊回车了,没有按照Python 的语法规则来,所以直接抛出了语法错误。
>>>if
File "<stdin>", line 1
if
^
SyntaxError: invalid syntax
还有⼀些错误,则是不可预料的错误,但是完全有可能发⽣的,⽐如⽂件不存在、磁盘空间不⾜、⽹络堵塞、系统错误等等。下⾯这个例⼦,使⽤ open函数打开 ⽂件,可是在当前⽬录下并没有这个⽂件,所以⼀定会打开失败,抛出了IOError。
>>> fp =open('')
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
shell命令查询某目录下的文件IOError:[Errno 2] No such file or directory:''
这些导致程序在运⾏过程中出现异常中断和退出的错误,我们统称为异常。正常情况下,异常都不会被程序处理,⽽是以错误信息的形式展现出来。
异常有很多种类型,Python内置了⼏⼗种常见的异常,就在builtins模块内,它们⽆需特别导⼊,就可以直接使⽤。需要注意的是,所有的异常都是异常类,⾸字母是⼤写的!
在发⽣异常的时候,Python会打印出异常信息,信息的前⾯部分显⽰了异常发⽣的上下⽂环境,并以调⽤栈的形式显⽰具体信息。异常类型作为信息的⼀部分也会被打印出来,例如ZeroDivisionError,TypeError。
>>>1/0
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
ZeroDivisionError: integer division or modulo by zero
>>>
>>>
>>>10+"1"
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
TypeError: unsupported operand type(s)for+:'int'and'str'
正常情况下,我们都不需要去记住 Python 到底内置了哪些错误和异常类型,除⾮你需要去捕获它,关于捕获的内容,我会放在下⼀节。这⼀节先来认识⼀下 Python 中有哪些常见的错误和异常,对于新⼿,下⾯的内容⼤概过⼀下就好,不⽤深究,因为这些在你以后的编码中都会遇到的。
1.1 SyntaxError
SyntaxError,是语法错误,可能是新⼿在学习 Python 时最容易遇到的错误
>>>while True print('Hello world')
File "<stdin>", line 1
while True print('Hello world')
^
SyntaxError: invalid syntax
1.2 TypeError
TypeError,是类型错误,也就是说将某个操作或功能应⽤于不合适类型的对象时引发,⽐如整型与字符型进⾏加减法
>>> a =10
>>> b ="1"
>>>
>>> a-b
霹雳游侠电影Traceback (most recent call last):
File "<stdin>", line 1,in<module>
TypeError: unsupported operand type(s)for-:'int'and'str'
1.3 IndexError
IndexError,是指索引出现了错误,⽐如最常见下标索引超出了序列边界
>>> alist =[0,1,2]
>>> alist[5]
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
junit4assert过时IndexError:list index out of range
1.4 KeyError
KeyError是关键字错误,这个异常主要发⽣在字典中,⽐如当⽤户试图访问⼀个字典中不存在的键时会被引发。
免费可商用的图片素材网站>>> profile ={"name":"王炳明"}
>>> profile["age"]
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
KeyError:'age'
1.5 ValueError
ValueError为值错误,当⽤户传⼊⼀个调⽤者不期望的值时会引发,即使这个值的类型是正确的,⽐如想获取⼀个列表中某个不存在值的索引。
>>>int("1")
1
>>>int("a")
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
ValueError: invalid literal for int()with base 10:'a'
1.6 AttributeError
AttributeError是属性错误,当⽤户试图访问⼀个对象不存在的属性时会引发。
⽐如字典有get⽅法,⽽列表却没有,所以对⼀个列表对象调⽤该⽅法就会引发该异常。
>>> alist =[0,1,2]
>>> (0)
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
AttributeError:'list'object has no attribute 'get'
1.7 NameError
NameError是指变量名称发⽣错误,⽐如⽤户试图调⽤⼀个还未被赋值或初始化的变量时会被触发。
>>> name
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
NameError: name 'name'is not defined
1.8 IOError
IOError为打开⽂件错误,当⽤户试图以读取⽅式打开⼀个不存在的⽂件时引发。
>>> fb =open('')
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
大学python入门教程IOError:[Errno 2] No such file or directory:''
1.9 StopIteration
StopIteration为迭代器错误,当访问⾄迭代器最后⼀个值时仍然继续访问,就会引发这种异常,提醒⽤户迭代器中已经没有值可供访问了。
>>> alist =range(2)
>>> agen =iter(alist)
>>>next(agen)
>>>next(agen)
ip route 命令1
>>>next(agen)
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
StopIteration
1.10 AssertionError
AssertionError为断⾔错误,当⽤户利⽤断⾔语句检测异常时,如果断⾔语句检测的表达式为假,则会引发这种异常。
>>> alist =[0,1,2]
>>>assert isinstance(alist,list)
>>>assert isinstance(alist,dict)
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
AssertionError
1.11 IndentationError
Python 是⼀门严格缩进的语⾔,如果缩进有问题,就会导致解释器解析异常,抛出IndentationError
>>>while True:
...print("hello")
File "<stdin>", line 2
print("hello")
^
IndentationError: expected an indented block
1.12 ImportError
当你在使⽤ import导包的时候,如果因为包名错误或者路径不对、包未安装,都会抛出 ImportError
>>>import oxx
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
ImportError: No module named oxx
2. 如何抛出和捕获异常
2.1 如何抛出异常?
异常的产⽣有两种来源:
⼀种是程序⾃动抛出,⽐如1/0会⾃动抛出 ZeroDivisionError
⼀种是开发者主动抛出,使⽤raise关键字抛出。
在 Python 中是使⽤ raise关键字来抛出异常的,⽐如在下⾯这个函数中,如果不存在⽬标⽂件,则会抛出⼀个 Exception通⽤异常。
def demo_func(filename):
if not os.path.isfile(filename):
raise Exception
<hr color=#000000 size=1">
2.2 如何捕获异常?
出现错误或者异常没有关系,关键在于你要学会预判程序可能会出现的错误或异常,然后在代码中捕获这些异常并处理。
异常的捕获的语法有如下四种:
第⼀种语法
只捕捉但是不想获取异常信息
try:
代码A
except[EXCEPTION]:
代码B
第⼆种语法
不但捕捉了还要获取异常信息,赋值给 e后,后⾯你可以把异常信息打印到⽇志中。
try:
代码A
except[EXCEPTION]as e:
代码B
有了上⾯的基础语法,可以扩展出下⾯三种常⽤的异常捕获的写法。
第三种语法
正常使⽤try ... except ...
如果代码A发⽣了异常,则会⾛到代码B的逻辑。
try:
代码A
except[exception]as e :
代码B
举个例⼦
>>>try:
...1/0
...except ZeroDivisionError as e:
.
..print("发⽣了异常:错误信息如下: \n"+str(e))
...
发⽣了异常:错误信息如下:
integer division or modulo by zero
第四种语法
使⽤try ... except ... else
如果代码A发⽣了异常,则会⾛到代码B的逻辑,如果没有发⽣异常,则会⾛到代码C
try:
代码A
except[exception]as e:
代码B
else:
代码C
举个例⼦
不发⽣异常的情况
>>>try:
...4/2
...except ZeroDivisionError as e:
...print("发⽣了异常:错误信息如下: \n"+str(e))
...else:
...print("程序正常运⾏")
...
2
程序正常运⾏
发⽣异常的情况
>>>try:
...1/0
...except ZeroDivisionError as e:
...print("发⽣了异常:错误信息如下: \n"+str(e))
...else:
...print("程序正常运⾏")
...
发⽣了异常:错误信息如下:
integer division or modulo by zero
第三种:使⽤ try ... except ... finally
如果代码A发⽣了异常,则会⾛到代码B的逻辑,最后不管有没有发⽣异常都会⾛到代码C
try:
代码A
except[exception]as e:
代码B
finally:
代码C
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论