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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。