raise 的作用

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

raise 的基本语法格式

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

raise 的基本用法

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

  • raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
  • raise 异常类名称:raise 后带一个异常类名称。该语句引发指定异常类的默认实例。
  • raise 异常类名称(描述信息):在引发指定异常的同时,附带异常的描述信息。

代码示例

try:
	a = input("输入一个数:")
	#判断用户输入的是否为数字
	if(not a.isdigit()):
		raise ValueError("a 必须是数字")
except ValueError as e:
	print("引发异常:",repr(e))

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

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 的子类,在自定义异常类时基本不需要书写更多的代码,只要指定自定义异常类的父类即可。

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

class AuctionException(Exception):
    pass

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

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