赞
踩
一、异常介绍
Python中使用异常对象来表示异常,遇到错误的时候就会引发异常。
异常对象未被捕获时,程序将终止并显示一条错误消息。
如果是函数不处理引发的异常,它将向上传到调用函数的地方。如果在那里也未处理,异常将继续传播,直至到达主程序。如果主程序也未处理异常,程序将终止并显示栈跟踪消息(traceback)。异常示例如下:
a = 3
b = 0
a/b
Traceback (most recent call last):
File "F:\Users\test.py", line 3, in <module>
a/b
~^~
ZeroDivisionError: division by zero
每个异常都是某个类的实例,这里是ZeroDivisionError。你可以引发或者捕获这些异常,做自己需要的一些措施。
对于异常报错,可以观察~^~中“^”的位置,一般都是出现错误的地方,可以重点查看代码。
如果需要自己引发异常,可使用raise语句,并将一个类(必须是Exception的子类)或实例作为参数。将类作为参数时,将自动创建一个实例。
raise Exception
Traceback (most recent call last):
File "F:\test.py", line 1, in <module>
raise Exception
Exception
raise 333
Traceback (most recent call last):
File "F:\test.py", line 1, in <module>
raise 333
TypeError: exceptions must derive from BaseException
常见内置异常类 | |
Exception | 几乎所有的异常类都是从它派生而来的 |
IndexError | 序列中没有此索引 |
ZeroDivisionError | 除或取模零引发 |
TypeError | 类型错误时引发 |
KeyError | 映射中不存在的键引发 |
NameError | 未声明或未初始化对象 |
SyntaxError | 代码语法错误时引发 |
ValueError | 传入无效参数 |
二、异常的处理
1、自定义异常类
同创建其他类一样,但需要直接或间接地继承Exception。
class MyExcept(Exception):
def myex(self):
print('自定义异常类')
try:
raise MyExcept
except MyExcept as e:
e.myex()
输出:
自定义异常类
2、捕获异常
可使用 try/except语句。
try:
10/0
except ZeroDivisionError:
print('捕获到了异常')
输出:
捕获到了异常
如果不处理异常,在except子句中使用不带参数的raise,但有时你可能想引发别的异常。
在这种情况下,导致进入except子句的异常将被作为异常上下文存储起来, 并出现在最终的错误消息中。
try:
10/0
except ZeroDivisionError:
raise
输出:
Traceback (most recent call last):
File "F:\test.py", line 8, in <module>
10/0
~~^~
ZeroDivisionError: division by zero
##################################################
try:
10/0
except ZeroDivisionError:
raise ValueError
异常输出:
Traceback (most recent call last):
File "F:\test.py", line 2, in <module>
10/0
~~^~
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "F:\test.py", line 4, in <module>
raise ValueError
ValueError
其中捕获到了ZeroDivisionError异常,但是raise又抛出异常ValueError,此时会将except信息存储起来,显示在错误消息里面,如果不抛出except的信息,可以使用from None,None位置处也可以自定义自己的异常。
try:
10/0
except ZeroDivisionError:
raise ValueError from None
异常输出:
Traceback (most recent call last):
File "F:\test.py", line 4, in <module>
raise ValueError from None
ValueError
多个except字句。
try:
x = 1
y = 'e'
print(x / y)
except ZeroDivisionError:
print("第二个参数不能为0!")
except TypeError:
print("参数类型错误?")
输出:
参数类型错误?
try:
x = 1
y = 0
print(x / y)
except ZeroDivisionError:
print("第二个参数不能为0!")
except TypeError:
print("参数类型错误?")
输出:
第二个参数不能为0!
一次性捕获多个异常,可以在最后增加BaseException,避免遗漏可能出现的异常。
try:
x = 1
y = 0
print(x / y)
except (ZeroDivisionError, TypeError):
print("参数错误!")
except BaseException
print("其他错误!")
输出:
参数错误
捕获异常并打印错误信息。
try:
x = 1
y = 0
print(x / y)
except (ZeroDivisionError, TypeError) as e:
print(e)
输出:
division by zero
捕获所有异常。
try:
x = 1
y = 0
print(x / y)
except :
print('异常了')
输出:
异常了
try:
x = 1
y = 0
print(x / y)
except Exception as e:
print(e)
输出:
division by zero
上面第一种直接使用except捕获方式可能对于不是从Exception派生出来的类无法捕获到异常,建议使用 except Exception as e 方式,并且还可以显示错误详细信息。
三、异常else和finally
1、try except else语句
如果try中没有抛出异常,则执行else,如果try中抛出异常,则执行except。
try:
x = 1
y = 5
print(x / y)
except Exception as e:
print(e)
else:
print('没有错误')
输出:
0.2
没有错误
try except else finally 语句,finally无论是否发生异常都会执行,常用来释放try中申请的资源。
try:
x = 1
y = 0
print(x / y)
except Exception as e:
print(e)
else:
print('没有错误')
finally:
print('end')
输出:
division by zero
end
四、traceback打印异常信息
有时候需要打印异常信息,可以使用traceback模块打印。
import traceback
try:
print(11111111111)
10/0
print(22222222222)
except ZeroDivisionError:
traceback.print_exc()
输出:
11111111111
Traceback (most recent call last):
File "F:\test.py", line 9, in <module>
10/0
~~^~
ZeroDivisionError: division by zero
五、其他
大多数时候,习惯使用条件语句if/else来处理异常,但这样写出来的代码可读性没那么高,可以替换使用try/except来完成。
关注公众号同步更新:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。