raise作用

python使用raise可以使程序主动抛出异常,该异常可以被try语句所捕获

raise基本语法格式

该语句的基本语法格式为:raise \[exceptionName \[(reason)]]

raise基本用法

raise 语句有如下三种常用的用法:

  1. raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
  2. raise 异常类名称:raise 后带一个异常类名称。该语句引发指定异常类的默认实例。
  3. raise 异常类名称(描述信息):在引发指定异常的同时,附带异常的描述信息。
代码示例
1
2
3
4
5
6
7
try:
a = input("输入一个数:")
#判断用户输入的是否为数字
if(not a.isdigit()):
raise ValueError("a 必须是数字")
except ValueError as e:
print("引发异常:",repr(e))

当用户输入的不是数字时,程序会进入 if 判断语句,并执行 raise 引发 ValueError 异常。但由于其位于 try 块中,因为 raise 抛出的异常会被 try 捕获,并由 except 块进行处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class AuctionException(Exception):
pass

class AuctionTest:
def __init__(self, init_price):
self.init_price = init_price

def bid(self, bid_price):
d = 0.0
try:
d = float(bid_price)
except Exception as e: # 此处只是简单地打印异常信息
print("转换出异常:", e) # 再次引发自定义异常
raise AuctionException("竞拍价必须是数值,不能包含其他字符!")
# raise AuctionException(e) #异常包装
if self.init_price > d:
raise AuctionException("竞拍价比起拍价低,不允许竞拍!")
print("竞拍成功!")

def main():
at = AuctionTest(20.4) #起拍价
a = input('请输入报价:')
try:
at.bid(a)
except AuctionException as ae: # 再次捕获到bid()方法中的异常,并对该异常进行处理
print('main函数捕捉的异常:', ae)

if __name__ == '__main__':
main()

raise AuctionException(e)

就是把原始异常 e 包装成了 AuctionException异常,这种方式也被称为异常包装或异常转译。

自定义异常类

很多时候,程序可选择引发自定义异常,因为异常的类名通常也包含了该异常的有用信息。所以在引发异常时,应该选择合适的异常类,从而可以明确地描述该异常情况。在这种情形下,应用程序常常需要引发自定义异常。

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

下面程序创建了一个自定义异常类:

1
2
class AuctionException(Exception):
pass

上面程序创建了 AuctionException 异常类,该异常类不需要类体定义,因此使用 pass 语句作为占位符即可。

在大部分情况下,创建自定义异常类都可采用与上面程序相似的代码来完成,只需改变 AuctionException 异常的类名即可,让该异常的类名可以准确地描述该异常.