Appearance
异常
异常,也就是错误。有能够让程序崩溃的错误,也有不会崩溃的错误。如果我们不确定某个地方究竟是否会出错,我们应当将这部分放入异常监听中,当触发异常的时候就能够根据程序返回的异常信息来判断发生了什么。
使用异常机制捕获的错误不会让程序崩溃
异常的关键字是:try...except...
python
try:
1/0
except:
print('0不能被1整除')如果想得到具体的错误,可以用下面这种:
python
try:
1/0
except Exception as e:
print(e)这里的Exception会从异常库中找到适合的异常类型并赋值给e,性能上不如直接给个确定的异常类型。
如果能够确定异常类型,只需把Exception换成那个类型即可。
注意:确定的异常类型不能够确定自身类型以外的异常,所以程序仍有崩溃的风险。
另外,一个except只能捕获第一个遇到的错误,即使try里可能有多个地方会触发错误
捕获多个异常
如果想捕获多个异常,向下继续写except即可:
python
try:
1/0
print(name)
except ZeroDivisionError as e:
print(e)
except Exception as e:
print(e)也可以一行里写好:
python
try:
print(name) # 编辑器里这里name会有标红,但程序是可运行的
except(ZeroDivisionError, Exception) as e:
print(e)常见异常类型
| 名称 | 说明 |
|---|---|
| Exception | 通用异常类型(基类) |
| ZeroDivisionError | 不能整除0 |
| AttributeError | 对象没有这个属性 |
| IOError | 输入输出操作失败 |
| IndexError | 没有当前的索引 |
| KeyError | 没有这个键值(key) |
| NameError | 没有这个变量(未初始化对象) |
| SyntaxError | Python语法错误 |
| SystemError | 解释器的系统错误 |
| ValueError | 传入的参数错误 |
finally
finally里写的代码块是一定会执行的,它跟随者try,是异常处理的重要部分。
当我们使用异常处理时,一定要带上except或者finally。except在没有错误的时候是不会触发的,而finnally则无论是否有错,当try里的代码执行完毕,最终都会执行。
python
try:
print('输出')
except:
print('有错才输出')
finally:
print('一定输出')自定义异常
自定义异常有两个方面:自定义异常信息、自定义异常类型。
- 异常信息
raise 异常类型(message)
像这样可以自定义异常,message是异常信息。
python
try:
def test(num):
if num == 1:
raise Exception('不可以传入数字1')
test(1)
except Exception as e:
print(e)- 异常类型
python
# 继承Exception基类
class MyError(Exception):
def __init__(self, message):
self.message = message
def test():
raise MyError('Custom Error Type')
try:
test()
except MyError as e:
print(e)断言 assert
用于判断一个表达式,在表达式条件为false的时候触发异常
与raise不同,assert的优势在于它能够先进行判断
格式:assert expression, message
其中,expression是判断语句,message是具体的错误信息
python
def test():
try:
assert 1<0,'hello'
except Exception as e:
print(e)
test()