💡 add log, exception, consts docstring

This commit is contained in:
yanyongyu 2022-01-18 16:12:12 +08:00
parent 27b1ded9a1
commit 608cf859c8
3 changed files with 110 additions and 72 deletions

View File

@ -7,21 +7,35 @@ from typing_extensions import Literal
# used by Matcher # used by Matcher
RECEIVE_KEY: Literal["_receive_{id}"] = "_receive_{id}" RECEIVE_KEY: Literal["_receive_{id}"] = "_receive_{id}"
"""`receive` 存储 key"""
LAST_RECEIVE_KEY: Literal["_last_receive"] = "_last_receive" LAST_RECEIVE_KEY: Literal["_last_receive"] = "_last_receive"
"""`last_receive` 存储 key"""
ARG_KEY: Literal["{key}"] = "{key}" ARG_KEY: Literal["{key}"] = "{key}"
"""`arg` 存储 key"""
REJECT_TARGET: Literal["_current_target"] = "_current_target" REJECT_TARGET: Literal["_current_target"] = "_current_target"
"""当前 `reject` 目标存储 key"""
REJECT_CACHE_TARGET: Literal["_next_target"] = "_next_target" REJECT_CACHE_TARGET: Literal["_next_target"] = "_next_target"
"""下一个 `reject` 目标存储 key"""
# used by Rule # used by Rule
PREFIX_KEY: Literal["_prefix"] = "_prefix" PREFIX_KEY: Literal["_prefix"] = "_prefix"
"""命令前缀存储 key"""
CMD_KEY: Literal["command"] = "command" CMD_KEY: Literal["command"] = "command"
"""命令元组存储 key"""
RAW_CMD_KEY: Literal["raw_command"] = "raw_command" RAW_CMD_KEY: Literal["raw_command"] = "raw_command"
"""命令文本存储 key"""
CMD_ARG_KEY: Literal["command_arg"] = "command_arg" CMD_ARG_KEY: Literal["command_arg"] = "command_arg"
"""命令参数存储 key"""
SHELL_ARGS: Literal["_args"] = "_args" SHELL_ARGS: Literal["_args"] = "_args"
"""shell 命令 parse 后参数字典存储 key"""
SHELL_ARGV: Literal["_argv"] = "_argv" SHELL_ARGV: Literal["_argv"] = "_argv"
"""shell 命令原始参数列表存储 key"""
REGEX_MATCHED: Literal["_matched"] = "_matched" REGEX_MATCHED: Literal["_matched"] = "_matched"
"""正则匹配结果存储 key"""
REGEX_GROUP: Literal["_matched_groups"] = "_matched_groups" REGEX_GROUP: Literal["_matched_groups"] = "_matched_groups"
"""正则匹配 group 元组存储 key"""
REGEX_DICT: Literal["_matched_dict"] = "_matched_dict" REGEX_DICT: Literal["_matched_dict"] = "_matched_dict"
"""正则匹配 group 字典存储 key"""

View File

@ -4,6 +4,28 @@
下列文档中的异常是所有 NoneBot 运行时可能会抛出的 下列文档中的异常是所有 NoneBot 运行时可能会抛出的
这些异常并非所有需要用户处理 NoneBot 内部运行时被捕获并进行对应操作 这些异常并非所有需要用户处理 NoneBot 内部运行时被捕获并进行对应操作
```bash
NoneBotException
ParserExit
ProcessException
| IgnoredException
| MockApiException
| StopPropagation
MatcherException
| SkippedException
| | TypeMisMatch
| PausedException
| RejectedException
| FinishedException
AdapterException
| NoLogException
| ApiNotAvailable
| NetworkError
| ActionFailed
DriverException
WebSocketClosed
```
FrontMatter: FrontMatter:
sidebar_position: 10 sidebar_position: 10
description: nonebot.exception 模块 description: nonebot.exception 模块
@ -15,16 +37,12 @@ from pydantic.fields import ModelField
class NoneBotException(Exception): class NoneBotException(Exception):
""" """所有 NoneBot 发生的异常基类。"""
所有 NoneBot 发生的异常基类
"""
# Rule Exception # Rule Exception
class ParserExit(NoneBotException): class ParserExit(NoneBotException):
""" """{ref}`nonebot.rule.shell_command` 处理消息失败时返回的异常"""
`shell command` 处理消息失败时返回的异常
"""
def __init__(self, status: int = 0, message: Optional[str] = None): def __init__(self, status: int = 0, message: Optional[str] = None):
self.status = status self.status = status
@ -39,21 +57,18 @@ class ParserExit(NoneBotException):
# Processor Exception # Processor Exception
class ProcessException(NoneBotException): class ProcessException(NoneBotException):
""" """事件处理过程中发生的异常基类。"""
事件处理过程中发生的异常基类
"""
class IgnoredException(ProcessException): class IgnoredException(ProcessException):
""" """指示 NoneBot 应该忽略该事件。可由 PreProcessor 抛出。
指示 NoneBot 应该忽略该事件可由 PreProcessor 抛出
参数: 参数:
reason: 忽略事件的原因 reason: 忽略事件的原因
""" """
def __init__(self, reason): def __init__(self, reason: Any):
self.reason = reason self.reason: Any = reason
def __repr__(self): def __repr__(self):
return f"<IgnoredException, reason={self.reason}>" return f"<IgnoredException, reason={self.reason}>"
@ -63,8 +78,7 @@ class IgnoredException(ProcessException):
class MockApiException(ProcessException): class MockApiException(ProcessException):
""" """指示 NoneBot 阻止本次 API 调用或修改本次调用返回值,并返回自定义内容。可由 api hook 抛出。
指示 NoneBot 阻止本次 API 调用或修改本次调用返回值并返回自定义内容可由 api hook 抛出
参数: 参数:
result: 返回的内容 result: 返回的内容
@ -81,34 +95,46 @@ class MockApiException(ProcessException):
class StopPropagation(ProcessException): class StopPropagation(ProcessException):
""" """指示 NoneBot 终止事件向下层传播。
指示 NoneBot 终止事件向下层传播
{ref}`nonebot.matcher.Matcher.block` `True`
或使用 {ref}`nonebot.matcher.Matcher.stop_propagation` 方法时抛出
用法: 用法:
`Matcher.block == True` 时抛出 ```python
matcher = on_notice(block=True)
# 或者
@matcher.handle()
async def handler(matcher: Matcher):
matcher.stop_propagation()
```
""" """
# Matcher Exceptions # Matcher Exceptions
class MatcherException(NoneBotException): class MatcherException(NoneBotException):
""" """所有 Matcher 发生的异常基类。"""
所有 Matcher 发生的异常基类
"""
class SkippedException(MatcherException): class SkippedException(MatcherException):
""" """指示 NoneBot 立即结束当前 `Handler` 的处理,继续处理下一个 `Handler`。
指示 NoneBot 立即结束当前 `Handler` 的处理继续处理下一个 `Handler`
可以在 `Handler` 中通过 {ref}`nonebot.matcher.Matcher.skip` 抛出
用法: 用法:
可以在 `Handler` 中通过 `Matcher.skip()` 抛出 ```python
def always_skip():
Matcher.skip()
@matcher.handle()
async def handler(dependency = Depends(always_skip)):
...
```
""" """
class TypeMisMatch(SkippedException): class TypeMisMatch(SkippedException):
""" """当前 `Handler` 的参数类型不匹配。"""
当前 `Handler` 的参数类型不匹配
"""
def __init__(self, param: ModelField, value: Any): def __init__(self, param: ModelField, value: Any):
self.param: ModelField = param self.param: ModelField = param
@ -122,91 +148,85 @@ class TypeMisMatch(SkippedException):
class PausedException(MatcherException): class PausedException(MatcherException):
""" """指示 NoneBot 结束当前 `Handler` 并等待下一条消息后继续下一个 `Handler`。可用于用户输入新信息。
指示 NoneBot 结束当前 `Handler` 并等待下一条消息后继续下一个 `Handler`
可用于用户输入新信息 可以在 `Handler` 中通过 {ref}`nonebot.matcher.Matcher.pause` 抛出
用法: 用法:
可以在 `Handler` 中通过 `Matcher.pause()` 抛出 ```python
@matcher.handle()
async def handler():
await matcher.pause("some message")
```
""" """
class RejectedException(MatcherException): class RejectedException(MatcherException):
""" """指示 NoneBot 结束当前 `Handler` 并等待下一条消息后重新运行当前 `Handler`。可用于用户重新输入。
指示 NoneBot 结束当前 `Handler` 并等待下一条消息后重新运行当前 `Handler`
可用于用户重新输入 可以在 `Handler` 中通过 {ref}`nonebot.matcher.Matcher.reject` 抛出
用法: 用法:
可以在 `Handler` 中通过 `Matcher.reject()` 抛出 ```python
@matcher.handle()
async def handler():
await matcher.reject("some message")
```
""" """
class FinishedException(MatcherException): class FinishedException(MatcherException):
""" """指示 NoneBot 结束当前 `Handler` 且后续 `Handler` 不再被运行。可用于结束用户会话。
指示 NoneBot 结束当前 `Handler` 且后续 `Handler` 不再被运行
可用于结束用户会话 可以在 `Handler` 中通过 {ref}`nonebot.matcher.Matcher.finish` 抛出
用法: 用法:
可以在 `Handler` 中通过 `Matcher.finish()` 抛出 ```python
@matcher.handle()
async def handler():
await matcher.finish("some message")
```
""" """
# Adapter Exceptions # Adapter Exceptions
class AdapterException(NoneBotException): class AdapterException(NoneBotException):
""" """代表 `Adapter` 抛出的异常,所有的 `Adapter` 都要在内部继承自这个 `Exception`
代表 `Adapter` 抛出的异常所有的 `Adapter` 都要在内部继承自这个 `Exception`
参数: 参数:
adapter_name: 标识 adapter adapter_name: 标识 adapter
""" """
def __init__(self, adapter_name: str) -> None: def __init__(self, adapter_name: str) -> None:
self.adapter_name = adapter_name self.adapter_name: str = adapter_name
class NoLogException(AdapterException): class NoLogException(AdapterException):
""" """指示 NoneBot 对当前 `Event` 进行处理但不显示 Log 信息。
指示 NoneBot 对当前 `Event` 进行处理但不显示 Log 信息可在 `get_log_string` 时抛出
"""
pass 可在 {ref}`nonebot.adapters._event.Event.get_log_string` 时抛出
"""
class ApiNotAvailable(AdapterException): class ApiNotAvailable(AdapterException):
""" """在 API 连接不可用时抛出。"""
API 连接不可用时抛出
"""
pass
class NetworkError(AdapterException): class NetworkError(AdapterException):
""" """在网络出现问题时抛出,如: API 请求地址不正确, API 请求无返回或返回状态非正常等。"""
在网络出现问题时抛出: API 请求地址不正确, API 请求无返回或返回状态非正常等
"""
pass
class ActionFailed(AdapterException): class ActionFailed(AdapterException):
""" """API 请求成功返回数据,但 API 操作失败。"""
API 请求成功返回数据 API 操作失败
"""
pass
# Driver Exceptions # Driver Exceptions
class DriverException(NoneBotException): class DriverException(NoneBotException):
""" """`Driver` 抛出的异常基类"""
`Driver` 抛出的异常基类
"""
class WebSocketClosed(DriverException): class WebSocketClosed(DriverException):
""" """WebSocket 连接已关闭"""
WebSocket 连接已关闭
"""
def __init__(self, code: int, reason: Optional[str] = None): def __init__(self, code: int, reason: Optional[str] = None):
self.code = code self.code = code

View File

@ -3,7 +3,8 @@
NoneBot 使用 [`loguru`][loguru] 来记录日志信息 NoneBot 使用 [`loguru`][loguru] 来记录日志信息
自定义 logger 请参考 [`loguru`][loguru] 文档 自定义 logger 请参考 [自定义日志](https://v2.nonebot.dev/docs/tutorial/custom-logger)
以及 [`loguru`][loguru] 文档
[loguru]: https://github.com/Delgan/loguru [loguru]: https://github.com/Delgan/loguru
@ -27,8 +28,7 @@ if TYPE_CHECKING:
# logger = logging.getLogger("nonebot") # logger = logging.getLogger("nonebot")
logger: "Logger" = loguru.logger logger: "Logger" = loguru.logger
""" """NoneBot 日志记录器对象。
NoneBot 日志记录器对象
默认信息: 默认信息:
@ -84,14 +84,16 @@ class LoguruHandler(logging.Handler): # pragma: no cover
logger.remove() logger.remove()
default_filter = Filter() default_filter: Filter = Filter()
default_format = ( """默认日志等级过滤器"""
default_format: str = (
"<g>{time:MM-DD HH:mm:ss}</g> " "<g>{time:MM-DD HH:mm:ss}</g> "
"[<lvl>{level}</lvl>] " "[<lvl>{level}</lvl>] "
"<c><u>{name}</u></c> | " "<c><u>{name}</u></c> | "
# "<c>{function}:{line}</c>| " # "<c>{function}:{line}</c>| "
"{message}" "{message}"
) )
"""默认日志格式"""
logger_id = logger.add( logger_id = logger.add(
sys.stdout, sys.stdout,
level=0, level=0,
@ -100,3 +102,5 @@ logger_id = logger.add(
filter=default_filter, filter=default_filter,
format=default_format, format=default_format,
) )
__autodoc__ = {"Filter": False, "LoguruHandler": False}