my_baseexception.py 5.42 KB
Newer Older
qunfeng qiu's avatar
qunfeng qiu committed
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""
@Version: 1.0
@Python Version:3.6.6
@Author: ludq1
@Email: ludq1@chinaunicom.cn
@date: 2023/04/07 11:40:00
@Description:
"""

import logging

from .globalconst import GlobalConst
from .my_stringutils import MyStringUtils
from .my_utils import MyUtils


class MyBaseException(Exception):
    """
    自定义的异常类, import 请使用 global
    """

    ret_val: str = MyStringUtils.EMPTY
    ret_code: str = '0'
    submitted_webarg: str = None

    def __init__(self, err_msg: str):
        r"""
        初始化异常
        Args:
            err_msg: 错误信息,不能为None或空字符串
        """

        # 判断 err_msg
        Exception.__init__(self, err_msg)
        self.ret_val = err_msg

    def __str__(self):
        r"""
        字符串表示,使用 ret_val , 不会返回None,至少时 EMPTY字符串
        Returns:

        """
        return MyStringUtils.to_str(self.ret_val)

    def __repr__(self):
        r"""
        字符串表示,使用 __str__ , 不会返回None,至少时 EMPTY字符串
        Returns:

        """
        return self.__str__()

    def gen_err(self) -> dict:
        r"""
        生成带有 RetCode,RetVal,SubmittedWebArg的标准dict
        Returns:

        """
        ret_dict = MyBaseException.format_to_standard_dict(self.ret_val, self.ret_code)

        if self.submitted_webarg is not None:
            ret_dict[GlobalConst.RETKEY_SUBMITTEDWEBARG] = MyStringUtils.to_str(
                MyUtils.do_filter_xss(self.submitted_webarg))

        return ret_dict

    @classmethod
    def format_to_standard_dict(cls, ret_val: str,
                                ret_code: str = GlobalConst.RETCODE_COMMON_ERROR, submitted_msg: str = None) -> dict:
        r"""
        将ret_val和ret_code格式化成 ryy项目组使用的标准json 字符串,
        即 { "RetCode": ret_code , "RetVal": ret_val }

        Args:
            ret_val:string 返回结果 , 自动对其进行 filterXss操作
            ret_code:string 返回码
            submitted_msg:

        Returns: json 返回json数据

        """
        ret_dict = dict()
        ret_dict[GlobalConst.RETKEY_RET_CODE] = MyStringUtils.to_str(MyUtils.do_filter_xss(ret_code))
        ret_dict[GlobalConst.RETKEY_RET_VAL] = MyStringUtils.to_str(MyUtils.do_filter_xss(ret_val))
        if submitted_msg is not None:
            ret_dict[GlobalConst.RETKEY_SUBMITTEDWEBARG] = MyStringUtils.to_str(MyUtils.do_filter_xss(submitted_msg))

        return ret_dict

    @classmethod
    def gen_ok_dict(cls) -> dict:
        r"""
        生成标准的 返回给前端的jsonObject,ok

        Args:

        Returns: json 返回json数据

        """
        ret_dict = dict()
        ret_dict[GlobalConst.RETKEY_RET_CODE] = GlobalConst.RETCODE_SUCESS_CODE
        ret_dict[GlobalConst.RETKEY_RET_VAL] = 'success'
        return ret_dict

    @classmethod
    def format_exception_to_standard_dict(cls, any_exception: Exception) -> dict:
        r"""
        将异常格式化为标准的带有 RetCode和RetVal的字典
        Args:
            any_exception:

        Returns:

        """
        if any_exception is None:
            raise ValueError("要格式化的异常对象为None")

        logging.exception(msg="exception")

        if MyUtils.has_attr(any_exception, 'gen_err', must_be_method=True):
            # 尝试使用 gen_err方法返回
            return any_exception.gen_err()
        else:
            if isinstance(any_exception, (NameError, ValueError,)):
                return MyBaseException.format_to_standard_dict(str(any_exception))
            else:
                return MyBaseException.format_to_standard_dict(
                    '{}:{}'.format(type(any_exception), any_exception)
                )


def create_base_exception(
        err_msg,
        ret_code='0',
        submitted_webarg=None
) -> MyBaseException:
    r"""
    初始化一个 MyBaseException
    Args:
        err_msg:
        ret_code:
        submitted_webarg:

    Returns:
        :rtype: MyBaseException

    """
    ret_excep = MyBaseException(err_msg)

    ret_excep.ret_code = ret_code
    ret_excep.submitted_webarg = submitted_webarg

    return ret_excep


def create_base_exception_with_dict(
        err_dict: dict,
        ret_code: str = '0',
        submitted_webarg: str = None
) -> MyBaseException:
    r"""
    初始化一个 MyBaseException,
    以 err_dict 中的RetVal为errMsg,
    以 err_dict 中的 SubmittedWebArg + submitted_webarg 为新的 submitted_webarg
    Args:
        err_dict:
        ret_code:
        submitted_webarg:

    Returns:
        :rtype: MyBaseException

    """

    # 确保 err_dict 是dict
    if not isinstance(err_dict, dict):
        raise ValueError("err_dict不是字典")

    # 获取 err_dict 中的 retVal
    err_msg = err_dict.get(GlobalConst.RETKEY_RET_VAL)
    # 获取 err_dict 中的 SubmittedWebArg
    ori_submitted_webarg = err_dict.get(GlobalConst.RETKEY_SUBMITTEDWEBARG)

    ret_excep = MyBaseException(err_msg)
    ret_excep.ret_code = ret_code

    if MyStringUtils.is_empty(ori_submitted_webarg):
        ret_excep.submitted_webarg = submitted_webarg
    else:
        if MyStringUtils.is_empty(submitted_webarg):
            ret_excep.submitted_webarg = ori_submitted_webarg
        else:
            ret_excep.submitted_webarg = '{};;;{}'.format(ori_submitted_webarg,
                                                          submitted_webarg)

    return ret_excep