Source code for pymprpc.errors

"""定义mprpc的标准错误和一些方法.

+ File: errors.py
+ Version: 0.5
+ Author: hsz
+ Email: hsz1273327@gmail.com
+ Copyright: 2018-02-08 hsz
+ License: MIT
+ History

    + 2018-01-23 created by hsz
    + 2018-01-23 version-0.5 by hsz
"""
from pymprpc.status_codes import STATUS_CODES

_mprpc_exceptions = {}  # 注册的异常保存在其中用于查找


[docs]def add_status_code(code): """用于将mprpc的标准异常注册到`_mprpc_exceptions`的装饰器. Parameters: code (int): - 标准状态码 Return: (Callable): - 装饰函数 """ def class_decorator(cls): """内部装饰函数,用于将异常类注册到对应的状态码. Parameters: cls (Callable): - 要注册的异常类 Return: (Callable): - 注册的异常类 """ cls.status_code = code _mprpc_exceptions[code] = cls return cls
return class_decorator
[docs]class MprpcException(Exception): """mprpc标准异常类. Attributes: status_code (int): - 状态码 """ def __init__(self, message: str, status_code: int=None): """初始化异常. Parameters: message (str): - 异常信息 status_code (int): - 状态码 """ super().__init__(message) if status_code is not None:
self.status_code = status_code
[docs]class MethodError(MprpcException): """mprpc的远程函数执行异常类. Attributes: status_code (int): - 状态码 ID (str): - 执行任务的ID EXCEPTION (str): - 错误的异常栈信息 """ def __init__(self, message, ID, exception=None, status_code=None): """初始化异常. Parameters: message (str): - 异常信息 ID (str): - 任务ID exception (str): - 异常栈信息 status_code (int): - 状态码 """ super().__init__(message, status_code) self.ID = ID
self.EXCEPTION = exception
[docs]class ServerException(MprpcException): """mprpc的服务异常类. Attributes: status_code (int): - 状态码 """
pass
[docs]class BrokerException(MprpcException): """mprpc的中介异常类. Attributes: status_code (int): - 状态码 """
pass
[docs]@add_status_code(51) class BrokerLoginError(BrokerException): """登录中介错误."""
pass
[docs]@add_status_code(400) class RequestError(MethodError): """请求错误."""
pass
[docs]@add_status_code(401) class NotFindError(MethodError): """未找到对应的函数错误."""
pass
[docs]@add_status_code(402) class ParamError(MethodError): """请求的参数与签名不符错误."""
pass
[docs]@add_status_code(403) class RestrictAccessError(MethodError): """限制访问对应函数错误."""
pass
[docs]@add_status_code(404) class RPCRuntimeError(MethodError): """函数执行错误."""
pass
[docs]@add_status_code(405) class ResultLimitError(MethodError): """返回的结果超过限制的字节限制错误."""
pass
[docs]@add_status_code(406) class UnsupportSysMethodError(MethodError): """不支持的服务器固有方法错误."""
pass
[docs]@add_status_code(500) class RpcException(ServerException): """服务器异常."""
pass
[docs]@add_status_code(501) class LoginError(ServerException): """登录失败异常."""
pass
[docs]@add_status_code(502) class RequirementException(ServerException): """服务器的依赖服务异常."""
pass
[docs]@add_status_code(503) class RpcUnavailableException(ServerException): """服务器不可用异常."""
pass
[docs]@add_status_code(504) class TimeoutException(ServerException): """服务器连接超时异常."""
pass
[docs]@add_status_code(505) class ProtocolException(ServerException): """协议错误."""
pass
[docs]@add_status_code(506) class ProtocolSyntaxException(ServerException): """协议语法错误."""
pass
[docs]def abort(status_code: int, ID: str=None, exception: str="", message: str=None): """根据状态码创建一个异常. Parameters: status_code (int): - 错误的状态码 ID (str): - 任务的ID号,通常是一个uuid,默认为None,服务错误不需要ID,方法调用错误需要ID exception (): - 错误的异常栈信息,默认为None,服务错误不需要,方法调用错误可以需要 message (str): - 错误信息 Return: (MprpcException): - 指定错误码对应的mprpc标准异常 """ if message is None: message = STATUS_CODES.get(status_code) # These are stored as bytes in the STATUS_CODES dict mprpc_exception = _mprpc_exceptions.get(status_code, MprpcException) if issubclass(mprpc_exception, MethodError) or ( mprpc_exception is MethodError): return mprpc_exception( message=message, ID=ID, exception=exception, status_code=status_code) return mprpc_exception( message=message,
status_code=status_code)