python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python自定义异常类

python自定义异常类方式

作者:编程小段

这篇文章主要介绍了python自定义异常类方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

python自定义异常类

why?

在开发中一般是禁止写if···else···的,虽然if···else···很好理解,但那样显得代码不专业,而且有时候会有点冗余!

what?

在python中一般都有一个异常类,这里面有一些自带的异常,比如:TypeError、ValueError 等,但这些远远不能满足我们的需求,我们时常会定义自己的异常包,然后导入这个包,这样就可以愉快的开发了,下面就来展示一下如何定义自己的异常类。

how?

我们想让函数返回值不是我们想要的时候就抛出异常,我们完全可以用C语言的if···else··语句,但是为了演示我们是用python的try···except···,raise表示抛出异常,就是在返回值不等于True的时候就抛出异常

#一般都会让异常继承这个类,(或者是更高级的BaseException)
#默认大家知道__init__和__str__
class NotEqual(Exception):
    def __init__(self, msg):
        self.msg = msg
    def __str__(self):
        return self.msg
class OPT():
    def test_suit(self, a):
        if a > 10:
            return True
        else:
            return False
    def test(self):
        try:
            if ( (True != self.test_suit(5)) or
                 (True != self.test_suit(15)) ):
            #raise表示抛出异常,后面必须是定义过的异常类,
            #括号中的内容是大家想让程序打印的内容
                raise NotEqual("not equal")    
        except NotEqual as e:
            print("{}".format(e))
if __name__ == '__main__':
    option = OPT()
    option.test()
#运行结果
>>>$ python test.py
>>>  not equal

程序结尾处的print表示打印到终端(屏幕)的内容,在开发中我们还应当加上python的日志系统(self.logger.debug("……")),让输出的内容打印到日志中,方便我们定位问题。

注意:

本来True == False不是异常,只是一个非真值,但在这里我们将其处理成了异常,因为python肯定没有这样的异常,所以我们必须在开始要定义一个异常类,这样就可以用了。

python自定义异常捕获

我们在处理程序异常的时候,可能需要自己定义一些传入的message,自己定义一些error对应的error_code,在后续做异常统计的时候可以有自定义的数据,这时候其实我们可以自定义异常捕获类。

异常类一般都是继承自Exception,自定义异常类如下:

class CustomException(Exception):
    """
    Customized Exception
    Exception raised for errors in the input salary.
    Attributes:
        msg  -- error message
        code -- error attribution
    """
    msg, code = "", 0
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)
class UnknownException(CustomException):
    code = 100
class ItemClickFailedException(CustomException):
    """
    clickable item clicking failed
    """
    msg = "failed to click item"
    code = 1
class ItemNotFoundException(CustomException):
    """
    clickable item not found
    """
    msg = "clickable item not found"
    code = 2

定义了异常类之后,可以在程序可能出现这些异常的时候,raise这些异常

 def random_click(self, item, items) -> Info:
      if len(items) == 0:
          raise ItemClickFailedException()
      if not self.is_clickable(item):
          raise ItemClickFailedException(msg="item is not visible")
      item_attr, item_rect = self.click_item(item)
      return Info(result=True, area=item_attr, x=item_rect.center[0], y=item_rect.center[1], error=[])

并在相应的时候去进行捕获

def click(self, item, items) -> ClickInfo:
    error_list = []
    try:
        result: ClickInfo = self.random_click(item, items)
    except Exception as e:
        # 此时捕获到的是具体的异常类实例
        error_list.append(e)
    for error in error_list:
        print("msg={}, code={}".format(error.msg, error.code))

如果之前raise的异常是ItemNotFoundException,那将打印出

msg=item is not visible, code=2

如果raise的异常是ItemClickFailedException,那将打印出

msg=failed to click item, code=1

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文