一.简单地使用 raise 语句来引发异常,那么该 raise 语句将会再次引发该 except 块所捕获的异常。
二.用户自定义异常都应该继承 Exception 基类或 Exception 的子类
class AuctionException(Exception):
pass
三.捕获异常时,有 2 种方式可获得更多的异常信息,分别是:
1)使用 sys 模块中的 exc_info 方法;
exc_info() 方法会将当前的异常信息以元组的形式返回,该元组中包含 3 个元素,分别为
type、value 和 traceback,它们的含义分别是:
type:异常类型的名称,它是 BaseException 的子类
value:捕获到的异常实例。
traceback:是一个 traceback 对象。
#使用 sys 模块之前,需使用 import 引入
import sys
try:
x = int(input("请输入一个被除数:"))
print("30除以",x,"等于",30/x)
except:
print(sys.exc_info())
print("其他异常...")
当输入 0 时,程序运行结果为:
请输入一个被除数:0
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero',), <traceback object at 0x000001FCF638DD48>)
其他异常...
2)使用 traceback 模块中的相关函数。
要查看 traceback 对象包含的内容,需要先引进 traceback 模块,然后调用 traceback 模块中的 print_tb 方法,并将 sys.exc_info() 输出的 traceback 对象作为参数参入。
#使用 sys 模块之前,需使用 import 引入
import sys
#引入traceback模块
import traceback
try:
x = int(input("请输入一个被除数:"))
print("30除以",x,"等于",30/x)
except:
#print(sys.exc_info())
traceback.print_tb(sys.exc_info()[2])
print("其他异常...")
输入 0,程序运行结果为:
请输入一个被除数:0
File "C:\Users\mengma\Desktop\demo.py", line 7, in <module>
print("30除以",x,"等于",30/x)
其他异常...
可以看到,输出信息中包含了更多的异常信息,包括文件名、抛出异常的代码所在的行数、抛出异常的具体代码。
print_tb 方法也仅是 traceback 模块众多方法中的一个。
四、使用 traceback 模块查看异常传播轨迹,首先需要将 traceback 模块引入,该模块提供了如下两个常用方法:
traceback.print_exc():将异常传播轨迹信息输出到控制台或指定文件中。
format_exc():将异常传播轨迹信息转换成字符串。
五、assert
语句的作用是:当条件表达式的值为真时,该语句什么也不做,程序正常运行;反之,若条件表达式的值为假,则 assert 会抛出 AssertionError 异常。其中,[,描述信息] 作为可选参数,用于对条件表达式可能产生的异常进行描述。
六、finally
除非在try,except调用了退出python解释器os._exit(1),否则不管任何情况,都会执行。