Exception和Raise的异常处理
Exception和Raise的异常处理
异常
学习python到现在,我们已经遇到过很多的报错信息,但⼀直没有认真研究,现在我们认真的研究⼀下:python⼀般会出现哪些错误呢?这些错误出现以后,我们该如何处理它们?
错误
Python三种常见的错误类型
语法错误(syntax error)
逻辑错误(logic error)
执⾏期间错误(runtime error)
⽐如:
>>>for i in range(10)
File "<stdin>", line 1
for i in range(10)
^
SyntaxError: invalid syntax
>>>
上⾯那句话因为缺少冒号:,导致解释器⽆法解释,于是报错。这个报错⾏为是由 Python 的语法分析器完成的,并且检测到了错误所在⽂件和⾏号(File “”, line 1),还以向上箭头^标识错误位置(后⾯缺少:),最后显⽰错误类型。
当 Python 检测到⼀个错误时,解释器就⽆法继续执⾏下去,于是抛出异常。
异常错误
系统会根据不同的异错误,丢出不同的异常。
异常种类繁多,现简要举例:
看⼀个异常(让0做分母了,这是⼩学⽣都相信会有异常的):
>>>1/0
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
ZeroDivisionError: division by zero
>>>
当 Python 抛出异常的时候,⾸先有“跟踪记录(Traceback)”,我们还可以给它取⼀个更优雅的名字——“回溯”。其后⾯显⽰异常的详细信息:⽐如异常所在位置(⽂件、⾏、在某个模块)。
最后⼀⾏是错误类型以及导致异常的原因。
下表中列出常见的异常
异常描述
NameError尝试访问⼀个没有申明的变量
ZeroDivisionError除数为0
SyntaxError语法错误
IndexError索引超出序列范围
IndexError索引超出序列范围
异常描述
KeyError请求⼀个不存在的字典关键字FileNotFoundError⽂件未发现错误(⽐如你要读的⽂件不存在)AttributeError尝试访问未知的对象属性ModuleNotFoundError模块未发现
IndentationError缩进
举例说明:
# NameError
>>> test
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
NameError: name 'test'is not defined
# IndentationError
>>>  a=123
File "<stdin>", line 1
a=123
^
IndentationError: unexpected indent
# IndexError
>>> a="abd"
>>> a[3]
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
IndexError: string index out of range
# ZeroDivisionError
>>>1/0
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
ZeroDivisionError: division by zero
# AttributeError
>>> a=Car()
>>> a.color
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
AttributeError:'Car'object has no attribute 'color'
>>>
# ModuleNotFoundError
>>>import self_defin
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
ModuleNotFoundError: No module named 'self_defin'
>>>
# KeyError
>>>dict={"name":"ws"}
>>>dict["age"]
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
KeyError:'age'
>>>
#  FileNotFoundError
>>> a=open("w.txt","r")
Traceback (most recent call last):
File "<stdin>", line 1,in<module>
FileNotFoundError:[Errno 2] No such file or directory:'w.txt'
>>>
# SyntaxError
>>>for i in rang
File "<stdin>", line 1
for i in rang
^
SyntaxError: invalid syntax
>>>
当我们在运⾏或者调试程序时遇到了异常,我们要学会阅读异常信息,到出错的位置,发现异常,并更正它。⽐如⽤ dir(),help() 或者官⽅⽹站⽂档、google 等来协助,⼀定能解决问题。
异常处理
前⾯说,当 Python 检测到⼀个错误时,解释器就⽆法继续执⾏下去,于是抛出异常。
所以,在⼀段程序中,为了能够让程序健壮,必须要处理异常。
我们可以⽤try ... except来处理异常,其语法格式如下:
try:
try_statements
eval是做什么的except[Exception [as identifier]]:
except_statements
[else:
else_statements]
[finally:
fanally_statements]
try⼦句
try … except 必须放在可能发⽣意外的程序段周围,⽽try_statements则是可能发⽣异常的程序段。
except⼦句
⽤来捕捉指定的异常,⼀旦捕捉到,就执⾏与之对应的except_statements,即⽤来处理异常的程序语句。
如果要针对不同的异常做不同的处理,可以使⽤多个except⼦句,其中,exceptionType是欲捕捉的异常类型,省略不写,表⽰为预设类型:BaseException,所有异常都继承⾃该类别。
[as identifier]可以将捕捉到的异常指向⼀个变量,然后,通过该变量获得异常相关的信息。
不带任何异常类型使⽤except,将捕获所有发⽣的异常。不推荐这么使⽤,因为我们不能通过该程序识别出具体的异常信息。
else⼦句
当try_statements没有异常发⽣时,会跳过except⼦句,执⾏else_statements。
该⼦句为可选语句,可以指定或者省略。
finally⼦句
当要离开try … except 时(⽆论异常是否发⽣),就会执⾏finally_statements,可以使清除错误或者收尾的语句。可给可忽略。
举个例⼦,编程求X/Y。
>>> x =eval(input("请输⼊被除数x:\t"))
请输⼊被除数x:10
>>> y =eval(input("请输⼊除数y:\t"))
请输⼊除数y:2
>>> z = x/y
>>>print("x/y=",z)
以上编程运⾏结果:
#第⼀种
C:\Users\asus\Desktop\pythondemo测试\python运⾏程序>python band.py
请输⼊被除数x:10
请输⼊除数y:2
x/y=5.0
#第⼆种
C:\Users\asus\Desktop\pythondemo测试\python运⾏程序>python band.py
请输⼊被除数x:12
请输⼊除数y:0
Traceback (most recent call last):
File "band.py", line 488,in<module>
z = x/y
ZeroDivisionError: division by zero
#第三种
C:\Users\asus\Desktop\pythondemo测试\python运⾏程序>python band.py
请输⼊被除数x:12
请输⼊除数y:    a
Traceback (most recent call last):
File "band.py", line 487,in<module>
y =eval(input("请输⼊除数y:\t"))
File "<string>", line 1,in<module>
NameError: name 'a'is not defined
#第四种
C:\Users\asus\Desktop\pythondemo测试\python运⾏程序>python band.py
请输⼊被除数x:12,
请输⼊除数y:1
Traceback (most recent call last):
File "band.py", line 488,in<module>
z = x/y
TypeError: unsupported operand type(s)for/:'tuple'and'int'
除去第⼀种以外,均抛出异常,退出程序。
捕捉以上程序中的异常1:
try:
x =eval(input("请输⼊被除数x:\t"))
y =eval(input("请输⼊除数y:\t"))
z = x/y
# except ZeroDivisionError:
#  print("除数不能为0")
# except NameError:
#  print("Name")
except(ZeroDivisionError,NameError,TypeError)as e:
print((type(e)),e)
print("程序可以正常运⾏")
现在⽤try…except改写,并捕捉相应的异常信息,并做出对应的处理,使程序不会因为异常⽽中断捕捉以上程序中的异常2:
try:
x =eval(input("请输⼊被除数x:\t"))
y =eval(input("请输⼊除数y:\t"))
z = x/y
except ZeroDivisionError:
print("除数不能为0")
except Exception as e:
print(e.args)
else:
print("未捕捉到异常",z)
finally:
print("离开pt 模块")

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。