当前位置: 首页 > 图灵资讯 > 行业资讯> Python超级详细的raise用法

Python超级详细的raise用法

发布时间:2025-10-30 16:16:21

当程序出现错误时,系统会自动引起异常。此外,Python还允许程序使用raise语句自行引起异常和异常。

在许多情况下,如果程序中的数据和执行与既定的业务需求不一致,系统是否会引起异常可能需要根据应用程序的业务需求来决定。由于与业务需求不一致而产生的异常必须由程序员决定,系统不能引起。

如果需要在程序中引起异常,则应使用它 raise 语句。raise 语句有三种常用用法:

raise:单独一个 raise。这句话引起了当前上下文捕获的异常(例如在 except 块中),或默认原因 RuntimeError 异常。

raise 异常类:raise 后面有一个异常类。这句话导致了指定异常类别的默认实例。

raise 异常对象:引起指定的异常对象。

以上三种用法最终都会导致一个异常实例(即使指定为异常类,实际上也会导致这类默认实例),raise 句子每次只能引起一个异常的例子。

可以利用 raise 再次重写前五子棋游戏中处理用户输入的代码:

try:
#将用户输入的字符串以逗号(,)为分隔符,分为两个字符串
x_str,y_str=inputStr.split(sep=",")
#如果要下棋的点不是空的
ifboard[int(y_str)-1][int(x_str)-1]!="+":
#Runtimeroror引起默认异常
raise
#赋予相应的列表元素“●”
board[int(y_str)-1][int(x_str)-1]=”●”
exceptExceptionase:
print(type(e))
inputStr=input("您输入的坐标不合法,请重新输入,下棋坐标应为x,y格式\n")
continue

在上述程序中排名第一 7 行代码使用 raise 当用户试图向现有棋子的坐标点下棋时,语句会引起异常。当 Python 当解释器接收到开发者自身引起的异常时,也会暂停当前的执行流,跳到与异常对应的地方 except 块,由该 except 块处理异常。也就是说,无论是系统自动引起的异常,还是程序员在动引起的异常,Python 解释器处理异常没有区别。

即使是用户自身引起的异常,也可以使用 try except 捕获它。当然,如果异常传播到,也可以让异常向上(先调用者)传播。 Python 解释器,然后程序将被暂停。

以下示例展示了两种处理用户异常的方法:

defmain():
try:
#使用try...except捕捉异常
#即使程序出现异常,也不会传播给main函数
mtd(3)
exceptExceptionase:
print('程序异常:',e)
#不要使用try...except捕获异常,会传播异常,导致程序暂停
mtd(3)
defmtd(a):
ifa>0:
raiseValueError("a值大于0,不符合要求")
main()

从以上程序可以看出,程序可以调用 mtd(3) 时使用 try except 捕获异常,使异常被捕获 except 块捕获不会传播到调用它的函数;也可以直接调用 mtd(3),这样函数的异常就会直接传播给其调用函数,如果函数不处理异常,就会导致程序中止。

在操作上述程序时,可以看到以下输出结果:

程序异常:a值大于0,不符合要求
Traceback(mostrecentcalllast):
File"C:\Users\mengma\Desktop\1.py",line13,in<module>
main()
File"C:\Users\mengma\Desktop\1.py",line9,inmain
mtd(3)
File"C:\Users\mengma\Desktop\1.py",line12,inmtd
raiseValueError("a的值大于0,不符合要求")
ValueError:a的值大于0,不符合要求

上述第一行输出是第一次调用 mtd (3) 结果,这种方法引起的异常被引起 except 块捕获和处理。后面的大输出是第二次调用 mtd(3) 因此,由于这种异常没有被发现 except 块捕获,所以异常一直向上传播,直到传递 Python 解释器导致程序中止。

第二次调用 mtd(3) 引发的以“File“前三行输出实际上显示了传输轨迹信息的异常。也就是说,如果程序不处理异常,Python 默认情况下,异常传输轨迹信息将输出到控制台。

自定义异常类

很多时候,程序可以选择引起自定义异常,因为异常的类名通常包含异常的有用信息。因此,在引起异常时,应选择合适的异常类别,以便清楚地描述异常情况。在这种情况下,应用程序通常需要引起自定义异常。

用户自定义异常应继承 Exception 基类或 Exception 子类,在自定义异常类时,基本上不需要写更多的代码,只需要指定自定义异常类的父类。

以下程序创建了一个自定义异常类别(程序1):

classAuctionException(Exception):pass

创建了上述程序 AuctionException 异常类,这个异常类不需要类体定义,所以使用 pass 句子可以作为占位符。

在大多数情况下,创建自定义异常类可以通过类似于程序一的代码来完成,只需要更改 AuctionException 可以使异常的类名准确描述异常。

except 和 raise 同时使用

在实际应用中,异常可能需要更复杂的处理方法。当出现异常时,单靠某种方法无法完全处理异常,必须通过多种方法配合才能完全处理异常。也就是说,在当前的异常方法中,程序只部分处理异常,有些处理只能在该方法的调用者中完成,因此应再次引起异常,使该方法的调用者也能捕获异常。

为了通过多种方式处理同一异常情况,可以在 except 块中结合 raise 完成语句。exceptt示范如下程序 和 raise 同时使用方法:

classAuctionException(Exception):pass
classAuctionTest:
def__init__(self,init_price):
self.init_price=init_price
defbid(self,bid_price):
d=0.0
try:
d=float(bid_price)
exceptExceptionase:
#这里只是简单地打印异常信息
print("异常转换:",e)
#自定义异常再次引起
raiseAuctionException("拍卖价格必须是价值,不能包含其他字符!")#①
raiseAuctionException(e)
ifself.init_price>d:
raiseAuctionException("拍卖价格低于拍卖价格,不允许拍卖!")
initPrice=d
defmain():
at=AuctionTest(20.4)
try:
at.bid("df")
exceptAuctionExceptionasae:
#再次捕获bid()方法中的异常,并处理异常
print('main函数捕获异常:',ae)
main()

上面程序中 9~13 行代码对应 except 块捕获异常后,系统打印异常字符串信息,然后引起一个 AuctionException 异常情况下,通知该方法的调用者再次处理 AuctionException 异常。所以在程序中 main() 函数,也就是 bid() 该方法的调用者也可以再次捕获 AuctionException 打印出异常的详细描述信息。

这种 except 和 raise 结合使用情况在实际应用中非常常用。异常处理的实际应用通常分为两部分:

应用背景需要通过日志记录异常的细节;

应用程序还需要根据异常情况向应用程序用户传达一些提示;

在这种情况下,所有异常都需要两种方法一起完成,即必须完成 except 和 raise 结合使用。

如果程序需要直接传播原始异常的详细信息,Python 也允许用自定义异常包装原始异常,只要包装在上面 ① 将号码代码改为以下形式:

raiseAuctionException(e)

raise 不需要参数

正如前面所看到的,正在使用 raise 句子可以不带参数,此时 raise 语句处于 except 在块中,它会自动引起当前上下文激活的异常;否则,通常是默认的 RuntimeError 异常。

例如,将上述程序改为以下形式:

classAuctionException(Exception):pass
classAuctionTest:
def__init__(self,init_price):
self.init_price=init_price
defbid(self,bid_price):
d=0.0
try:
d=float(bid_price)
exceptExceptionase:
#这里只是简单地打印异常信息
print("异常转换:",e)
#自定义异常再次引起
raise
ifself.init_price>d:
raiseAuctionException("拍卖价格低于拍卖价格,不允许拍卖!")
initPrice=d
defmain():
at=AuctionTest(20.4)
try:
at.bid("df")
exceptAuctionExceptionasae:
#再次捕获bid()方法中的异常,并处理异常
print('main函数捕获异常:',ae)
main()

正如从 13 此时程序在行代码中看到 except 块只是简单的使用 raise 如果句子引起异常,应该 raise 这个句子会再次引发 except 块捕获的异常。运行此程序时,可以看到以下输出结果:

异常转换:couldnotconvertstringtofloat:'df'
捕获main函数的异常:<class'ValueError'>

从输出结果来看,此时 main() 函数再次被捕获 ValueError,它就是在 bid() 方法中 except 块捕获的原始异常。

相关文章

Python超级详细的raise用法

Python超级详细的raise用法

2025-10-30
Python函数默认参数设置

Python函数默认参数设置

2025-10-29
Python os模块及用法

Python os模块及用法

2025-10-29
Python random模块及用法

Python random模块及用法

2025-10-29
urllib和urllib2有什么区别

urllib和urllib2有什么区别

2025-10-29
Python time模块详解

Python time模块详解

2025-10-29