Module mirai.exceptions

此模块提供异常相关。

Expand source code
# -*- coding: utf-8 -*-
"""
此模块提供异常相关。
"""
import re
import traceback
from typing import Type, cast

from pydantic import ValidationError


class NetworkError(RuntimeError):
    """网络连接出错。"""


API_ERROR_FMT = {
    0: '正常。',
    1: 'Verify Key 错误。',
    2: '指定的 Bot 不存在。',
    3: 'Session 失效或不存在。',
    4: 'Session 未认证或未激活。',
    5: '发送消息目标不存在,或指定对象不存在。',
    6: '指定文件不存在。',
    10: 'Bot 无对应操作的权限。',
    20: 'Bot 被禁言。',
    30: '消息过长。',
    400: '参数错误。',
    500: 'mirai 内部错误。',
}


class ApiError(RuntimeError):
    """调用 API 出错。"""
    def __init__(self, response: dict):
        """
        Args:
            response(`dict`): mirai-api-http 的 API 返回结果。
        """
        code = response['code']
        self.code = code
        self.args = (
            code, f'[ERROR {code}]' + API_ERROR_FMT.get(code, ''),
            response.get('msg', '')
        )


class StopPropagation(Exception):
    """终止事件处理器执行,并停止事件向上传播。"""


class StopExecution(Exception):
    """终止事件处理器执行,但不阻止事件向上传播。"""


class SkipExecution(Exception):
    """跳过同优先度的事件处理器,进入下一优先度。"""


class ApiParametersError(TypeError):
    """API 参数错误。"""
    def __init__(self, err: ValidationError):
        """
        Args:
            err(`str`): pydantic 的解析错误。
        """
        from mirai.models.api import ApiModel
        self._err = err
        model = cast(Type['ApiModel'], err.model)
        try:
            errors = [f'在调用 `{model.Info.alias}` 时出错。']
            for error in self._err.errors():
                parameter_name = str(error['loc'][0])
                parameter_name = re.sub(
                    r'[A-Z]', lambda m: f'_{m.group(0).lower()}',
                    parameter_name
                )

                message = error['msg']
                errors.append(f'参数 `{parameter_name}` 类型错误,原因:{message}')
            self.args = tuple(errors)
        except TypeError:
            self.args = (err.json(), )


def print_exception(e: Exception):
    """打印异常信息。"""
    traceback.print_exception(type(e), e, e.__traceback__)


__all__ = [
    'NetworkError', 'ApiError', 'StopPropagation', 'StopExecution',
    'SkipExecution', 'print_exception'
]

Functions

def print_exception(e: Exception)

打印异常信息。

Expand source code
def print_exception(e: Exception):
    """打印异常信息。"""
    traceback.print_exception(type(e), e, e.__traceback__)

Classes

class ApiError (response: dict)

调用 API 出错。

Args

response(dict): mirai-api-http 的 API 返回结果。

Expand source code
class ApiError(RuntimeError):
    """调用 API 出错。"""
    def __init__(self, response: dict):
        """
        Args:
            response(`dict`): mirai-api-http 的 API 返回结果。
        """
        code = response['code']
        self.code = code
        self.args = (
            code, f'[ERROR {code}]' + API_ERROR_FMT.get(code, ''),
            response.get('msg', '')
        )

Ancestors

  • builtins.RuntimeError
  • builtins.Exception
  • builtins.BaseException
class NetworkError (*args, **kwargs)

网络连接出错。

Expand source code
class NetworkError(RuntimeError):
    """网络连接出错。"""

Ancestors

  • builtins.RuntimeError
  • builtins.Exception
  • builtins.BaseException
class SkipExecution (*args, **kwargs)

跳过同优先度的事件处理器,进入下一优先度。

Expand source code
class SkipExecution(Exception):
    """跳过同优先度的事件处理器,进入下一优先度。"""

Ancestors

  • builtins.Exception
  • builtins.BaseException
class StopExecution (*args, **kwargs)

终止事件处理器执行,但不阻止事件向上传播。

Expand source code
class StopExecution(Exception):
    """终止事件处理器执行,但不阻止事件向上传播。"""

Ancestors

  • builtins.Exception
  • builtins.BaseException
class StopPropagation (*args, **kwargs)

终止事件处理器执行,并停止事件向上传播。

Expand source code
class StopPropagation(Exception):
    """终止事件处理器执行,并停止事件向上传播。"""

Ancestors

  • builtins.Exception
  • builtins.BaseException