# utils.exception_tool模块说明 exception_tool异常处理工具,提供便捷的异常处理模式,用于简化代码中的异常匹配错误码(基于CResult类)、异常忽略、异常日志登记的处理。 ## ExceptionTool工具类 ### ignored 忽略指定异常,简化异常捕获代码,利用该函数忽略指定的异常,详细说明如下: 1、对于指定忽略的异常,忽略不处理(如果指定logger则会进行日志输出,使用WARNING级别) 2、对于非指定的异常,仍抛出异常(如果指定logger则会进行日志输出,使用ERROR级别) 3、输出的日志为self_log_msg+'\n'+trace_str 重要参数定义: (expect=(), logger=None, self_log_msg='', force_log_level=None) @param {tuple} expect=() - 需要忽略的异常列表,例如(ZeroDivisionError, ValueError) @param {object} logger=None - 日志对象,如果为None代表不需要输出日志,传入对象需满足: ​ 1、标准logging的logger对象 ​ 2、自定义的日志类对象,但应实现warning、error的标准方法 使用示例: ``` # 以下代码将忽略ZeroDivisionError、ValueError这两类异常,程序正常往下执行 with ignored((ZeroDivisionError, ValueError), logger, '执行XX出现异常'): count = 1 / 0 count = count + 10000 ``` ### ignored_all 忽略除指定以外的所有异常,简化异常捕获代码,利用该函数忽略指定以外的所有异常,详细说明如下: ​ 1、对于指定以外的异常,忽略不处理(如果指定logger则会进行日志输出,使用WARNING级别) ​ 2、对于指定的异常,仍抛出异常(如果指定logger则会进行日志输出,使用ERROR级别) ​ 3、输出的日志为self_log_msg+'\n'+trace_str 重要参数定义: (unexpect=(), logger=None, self_log_msg='', force_log_level=None) @param {tuple} unexpect=() - 指定不能忽略的异常列表,例如(ZeroDivisionError, ValueError) 使用示例: ``` # 以下代码将抛出ZeroDivisionError异常,程序中断 with ignored_all((ZeroDivisionError, ValueError), logger, '执行XX出现异常'): count = 1 / 0 count = count + 10000 ``` ### ignored_cresult **特别注意:在 with 内部避免使用 result_obj 对应的变量处理其他函数的返回值(整个对象会被重新构建),这样可能会导致捕获一场后无法正常处理 result_obj 对象而出现异常被直接忽略的情况。** 忽略异常并设置CResult对象,简化异常捕获代码,利用该函数忽略指定的异常,并设置传入的通用结果对象,详细说明如下: ​ 1、对于指定忽略的异常,忽略不处理,结果为成功(如果指定logger则会进行日志输出,使用WARNING级别) ​ 2、对于非指定的异常,不抛出异常,结果为失败(如果指定logger则会进行日志输出,使用ERROR级别) ​ 3、输出的日志为self_log_msg+'\n'+trace_str ​ 4、根据error_map的映射关系设置错误码和错误信息 重要参数定义: (result_obj=None, error_map={}, expect=(), expect_no_log=False, expect_use_error_map=True, logger=None, self_log_msg='', force_log_level=None, i18n_obj=None, i18n_msg_paras=()) ​ @param {CResult} result_obj=None - 需要设置的错误类对象(对象值会被修改) ​ @param {dict} error_map={} - 用来设置错误类对象的映射表,具体说明如下: ​ 1、key为异常类,value为(code, msg)的错误码、错误描述二元组,如果msg=None代表使用标准错误码 ​ 2、应有一个'DEFAULT'的key,代表没有匹配上的异常映射,默认value为('29999', None) ​ 3、应有一个'SUCESS'的key,代表成功的映射,默认value为('00000', None) ​ 注:value也可以为(code, msg, i18n_msg_paras)的错误码、错误描述、国际化替换参数三元组, ​ i18n_msg_paras为tuple类型, 使用该模式支持CResult的国际化处理 ​ @param {tuple} expect=() - 需要忽略的异常列表,例如(ZeroDivisionError, ValueError) ​ @param {bool} expect_no_log=False - 忽略异常列表是否不打印日志 ​ @param {bool} expect_use_error_map=True - 忽略异常列表所匹配到的异常,所返回错误码是否使用错误码映射表: ​ 如果在映射表中匹配上则返回映射表的错误码;匹配不上则返回成功 ​ @param {object} i18n_obj=None - 国际化类的实例对象,该对象需实现translate方法 ​ @param {tuple} i18n_msg_paras=() - 与self_log_msg配套使用,当使用国际化时,可以传入变量,用于替换self_log_msg中的$1占位符 使用示例: ``` # 以下代码封装所有异常的获取(不会抛出新异常) # 遇到expect中的ValueError异常时,尝试从error_map匹配错误码,因为匹配不到会将result修改为'00000'的成功状态 # 遇到非expect的异常,尝试从error_map匹配错误码,因为匹配不到会将result修改为'29999'的失败状态 # 遇到非expect的ZeroDivisionError异常,由于从error_map中匹配到错误码,则将result修改为'10001'的状态 result = CResult() with ExceptionTools.ignored_CResult(result_obj=result, error_map={ZeroDivisionError: ('10001', 'zero division error')},expect=(ValueError),logger=None,self_log_msg=''): i = 1/0 i = i + 1000 ```