本文所记述的是一些基础知识点中平时用的比较少的方法。
一、主动引发异常
使用raise语句主动引发异常,例如:
raise Exception
一些常用的异常类:
- Exception 几乎所有的异常类都是从它派生而来的
- AttributeError 引用属性或给它赋值失败时引发
- OSError 操作系统不能执行指定的任务(如打开文件)时引发,有多个子类
- IndexError 使用序列中不存在的索引时引发,为LookupError的子类
- KeyError 使用映射中不存在的键时引发,为LookupError的子类
- NameError 找不到名称(变量)时引发
- SyntaxError 代码不正确时引发
- TypeError 将内置操作或函数用于类型不正确的对象时引发
- ValueError 将内置操作或函数用于这样的对象时引发:其类型正确但包含的值不合适
- ZeroDivisionError 在除法或求模运算的第二个参数为零时引发
二、raise...from...
在执行下列语句是会引发两个异常。
try:
1/0
except ZeroDivisionError:
raise ValueError
一个是由ZeroDivisionError引发的:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero
另一个是由ValueError引发的:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
ValueError
使用raise ... from ...语句可以提供自己的异常上下文,使用None将禁用except捕获的异常的上下文。
例如以下代码:
try:
1/0
except ZeroDivisionError:
raise ValueError from None
# 输出:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
ValueError
三、捕获多个异常
1.使用多个except语句
try:
x = int(input('Enter the first number: '))
y = int(input('Enter the second number: '))
print(x / y)
except ZeroDivisionError:
print("The second number can't be zero!")
except TypeError:
print("That wasn't a number, was it?")
2.使用一条语句捕获多个异常
注意:这种方法except语句后面的各类异常必须加括号。
try:
x = int(input('Enter the first number: '))
y = int(input('Enter the second number: '))
print(x / y)
except (ZeroDivisionError, TypeError, NameError):
print('Your numbers were bogus ...')
四、获取异常信息:as e
try:
x = int(input('Enter the first number: '))
y = int(input('Enter the second number: '))
print(x / y)
except (ZeroDivisionError, TypeError) as e:
print(e)
当然,也可以使用Exception方法捕获所以的异常信息,例如:
try:
x = int(input('Enter the first number: '))
y = int(input('Enter the second number: '))
print(x / y)
except Exception as e:
print(e)
五、else和finally
else和finally都是紧接try...except...语句的,不同的是,else只有在异常没有被引发时才会执行,而finally无论异常是否引发,都会被执行。
网友评论