ErisPulse 1.1.14.dev1__py3-none-any.whl → 1.1.16__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ErisPulse/__init__.py +189 -164
- ErisPulse/__main__.py +74 -2
- ErisPulse/adapter.py +211 -32
- ErisPulse/db.py +408 -36
- ErisPulse/logger.py +101 -57
- ErisPulse/mods.py +235 -19
- ErisPulse/raiserr.py +65 -38
- {erispulse-1.1.14.dev1.dist-info → erispulse-1.1.16.dist-info}/METADATA +78 -45
- erispulse-1.1.16.dist-info/RECORD +13 -0
- {erispulse-1.1.14.dev1.dist-info → erispulse-1.1.16.dist-info}/entry_points.txt +2 -2
- erispulse-1.1.14.dev1.dist-info/RECORD +0 -13
- {erispulse-1.1.14.dev1.dist-info → erispulse-1.1.16.dist-info}/WHEEL +0 -0
- {erispulse-1.1.14.dev1.dist-info → erispulse-1.1.16.dist-info}/licenses/LICENSE +0 -0
ErisPulse/logger.py
CHANGED
|
@@ -1,53 +1,123 @@
|
|
|
1
1
|
"""
|
|
2
2
|
# 日志系统
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
提供模块化、多级别的日志记录功能,支持内存存储和文件输出。实现了模块级别的日志控制、彩色输出和灵活的存储选项。
|
|
5
5
|
|
|
6
6
|
## API 文档
|
|
7
|
-
### 基本操作:
|
|
8
|
-
- debug(msg, *args, **kwargs): 调试信息
|
|
9
|
-
- info(msg, *args, **kwargs): 运行信息
|
|
10
|
-
- warning(msg, *args, **kwargs): 警告信息
|
|
11
|
-
- error(msg, *args, **kwargs): 错误信息
|
|
12
|
-
- critical(msg, *args, **kwargs): 致命错误并终止程序
|
|
13
7
|
|
|
14
|
-
###
|
|
15
|
-
- set_level(level): 设置全局日志级别
|
|
16
|
-
- set_module_level(module_name, level): 设置模块日志级别
|
|
8
|
+
### 基本日志操作
|
|
17
9
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
- set_output_file(path): 设置日志输出文件
|
|
10
|
+
以debug为例:
|
|
11
|
+
> 此外,还有其他级别的日志记录函数,如info, warning, error, critical等,用法相同。
|
|
21
12
|
|
|
22
|
-
|
|
13
|
+
debug(msg: str, *args, **kwargs) -> None
|
|
23
14
|
|
|
24
|
-
|
|
25
|
-
|
|
15
|
+
记录调试级别的日志信息。
|
|
16
|
+
- 参数:
|
|
17
|
+
- msg: 日志消息
|
|
18
|
+
- *args: 传递给底层logger的位置参数
|
|
19
|
+
- **kwargs: 传递给底层logger的关键字参数
|
|
20
|
+
- 返回:
|
|
21
|
+
- None
|
|
22
|
+
- 示例:
|
|
26
23
|
|
|
27
|
-
|
|
28
|
-
sdk.logger.debug("
|
|
29
|
-
|
|
24
|
+
```python
|
|
25
|
+
sdk.logger.debug("这是一条日志")
|
|
26
|
+
```
|
|
30
27
|
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
### 日志级别控制
|
|
29
|
+
#### set_level(level: str) -> None
|
|
30
|
+
设置全局日志级别。
|
|
31
|
+
- 参数:
|
|
32
|
+
- level: 日志级别,可选值为 "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"
|
|
33
|
+
- 返回:
|
|
34
|
+
- None
|
|
35
|
+
- 示例:
|
|
36
|
+
```python
|
|
37
|
+
# 设置为调试级别
|
|
38
|
+
sdk.logger.set_level("DEBUG")
|
|
39
|
+
|
|
40
|
+
# 设置为生产环境级别
|
|
41
|
+
sdk.logger.set_level("INFO")
|
|
42
|
+
|
|
43
|
+
# 根据环境设置日志级别
|
|
44
|
+
if is_production():
|
|
45
|
+
sdk.logger.set_level("WARNING")
|
|
46
|
+
else:
|
|
47
|
+
sdk.logger.set_level("DEBUG")
|
|
48
|
+
```
|
|
33
49
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
50
|
+
#### set_module_level(module_name: str, level: str) -> bool
|
|
51
|
+
设置特定模块的日志级别。
|
|
52
|
+
- 参数:
|
|
53
|
+
- module_name: 模块名称
|
|
54
|
+
- level: 日志级别,可选值为 "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"
|
|
55
|
+
- 返回:
|
|
56
|
+
- bool: 设置是否成功
|
|
57
|
+
- 示例:
|
|
58
|
+
```python
|
|
59
|
+
# 为特定模块设置详细日志
|
|
60
|
+
sdk.logger.set_module_level("NetworkModule", "DEBUG")
|
|
61
|
+
|
|
62
|
+
# 为敏感模块设置更高级别
|
|
63
|
+
sdk.logger.set_module_level("AuthModule", "WARNING")
|
|
64
|
+
|
|
65
|
+
# 根据配置设置模块日志级别
|
|
66
|
+
for module, level in config.get("logging", {}).items():
|
|
67
|
+
success = sdk.logger.set_module_level(module, level)
|
|
68
|
+
if not success:
|
|
69
|
+
print(f"无法为模块 {module} 设置日志级别 {level}")
|
|
38
70
|
```
|
|
39
71
|
|
|
40
|
-
|
|
72
|
+
### 日志存储和输出
|
|
73
|
+
#### set_output_file(path: str | list) -> None
|
|
74
|
+
设置日志输出文件。
|
|
75
|
+
- 参数:
|
|
76
|
+
- path: 日志文件路径,可以是单个字符串或路径列表
|
|
77
|
+
- 返回:
|
|
78
|
+
- None
|
|
79
|
+
- 异常:
|
|
80
|
+
- 如果无法设置日志文件,会抛出异常
|
|
81
|
+
- 示例:
|
|
82
|
+
```python
|
|
83
|
+
# 设置单个日志文件
|
|
84
|
+
sdk.logger.set_output_file("app.log")
|
|
85
|
+
|
|
86
|
+
# 设置多个日志文件
|
|
87
|
+
sdk.logger.set_output_file(["app.log", "debug.log"])
|
|
88
|
+
|
|
89
|
+
# 使用日期命名日志文件
|
|
90
|
+
from datetime import datetime
|
|
91
|
+
log_file = f"logs/app_{datetime.now().strftime('%Y%m%d')}.log"
|
|
92
|
+
sdk.logger.set_output_file(log_file)
|
|
93
|
+
```
|
|
41
94
|
|
|
42
|
-
|
|
43
|
-
|
|
95
|
+
#### save_logs(path: str | list) -> None
|
|
96
|
+
保存内存中的日志到文件。
|
|
97
|
+
- 参数:
|
|
98
|
+
- path: 保存路径,可以是单个字符串或路径列表
|
|
99
|
+
- 返回:
|
|
100
|
+
- None
|
|
101
|
+
- 异常:
|
|
102
|
+
- 如果无法保存日志,会抛出异常
|
|
103
|
+
- 示例:
|
|
104
|
+
```python
|
|
105
|
+
# 保存到单个文件
|
|
106
|
+
sdk.logger.save_logs("saved_logs.txt")
|
|
107
|
+
|
|
108
|
+
# 保存到多个文件
|
|
109
|
+
sdk.logger.save_logs(["main_log.txt", "backup_log.txt"])
|
|
110
|
+
|
|
111
|
+
# 在应用退出前保存日志
|
|
112
|
+
import atexit
|
|
113
|
+
atexit.register(lambda: sdk.logger.save_logs("final_logs.txt"))
|
|
114
|
+
```
|
|
44
115
|
|
|
45
116
|
"""
|
|
46
117
|
|
|
47
118
|
import logging
|
|
48
119
|
import inspect
|
|
49
120
|
import datetime
|
|
50
|
-
import functools
|
|
51
121
|
|
|
52
122
|
class Logger:
|
|
53
123
|
def __init__(self):
|
|
@@ -117,34 +187,6 @@ class Logger:
|
|
|
117
187
|
self._logger.error(f"无法保存日志到 {p}: {e}。")
|
|
118
188
|
raise e
|
|
119
189
|
|
|
120
|
-
def catch(self, func_or_level=None, level="error"):
|
|
121
|
-
if isinstance(func_or_level, str):
|
|
122
|
-
return lambda func: self.catch(func, level=func_or_level)
|
|
123
|
-
if func_or_level is None:
|
|
124
|
-
return lambda func: self.catch(func, level=level)
|
|
125
|
-
func = func_or_level
|
|
126
|
-
|
|
127
|
-
@functools.wraps(func)
|
|
128
|
-
def wrapper(*args, **kwargs):
|
|
129
|
-
try:
|
|
130
|
-
return func(*args, **kwargs)
|
|
131
|
-
except Exception as e:
|
|
132
|
-
import traceback
|
|
133
|
-
error_info = traceback.format_exc()
|
|
134
|
-
|
|
135
|
-
module_name = func.__module__
|
|
136
|
-
if module_name == "__main__":
|
|
137
|
-
module_name = "Main"
|
|
138
|
-
func_name = func.__name__
|
|
139
|
-
|
|
140
|
-
error_msg = f"Exception in {func_name}: {str(e)}\n{error_info}"
|
|
141
|
-
|
|
142
|
-
log_method = getattr(self, level, self.error)
|
|
143
|
-
log_method(error_msg)
|
|
144
|
-
|
|
145
|
-
return None
|
|
146
|
-
return wrapper
|
|
147
|
-
|
|
148
190
|
def _save_in_memory(self, ModuleName, msg):
|
|
149
191
|
if ModuleName not in self._logs:
|
|
150
192
|
self._logs[ModuleName] = []
|
|
@@ -163,6 +205,8 @@ class Logger:
|
|
|
163
205
|
module_name = "Main"
|
|
164
206
|
if module_name.endswith(".Core"):
|
|
165
207
|
module_name = module_name[:-5]
|
|
208
|
+
if module_name.startswith("ErisPulse"):
|
|
209
|
+
module_name = "ErisPulse"
|
|
166
210
|
return module_name
|
|
167
211
|
|
|
168
212
|
def debug(self, msg, *args, **kwargs):
|
ErisPulse/mods.py
CHANGED
|
@@ -1,37 +1,253 @@
|
|
|
1
1
|
"""
|
|
2
2
|
# 模块管理系统
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
提供模块的注册、状态管理和依赖解析功能。支持模块信息存储、状态切换和批量操作。
|
|
5
5
|
|
|
6
6
|
## API 文档
|
|
7
|
-
### 模块状态:
|
|
8
|
-
- set_module_status(module_name, status): 设置模块启用状态
|
|
9
|
-
- get_module_status(module_name): 获取模块状态
|
|
10
7
|
|
|
11
|
-
###
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
### 模块状态管理
|
|
9
|
+
#### set_module_status(module_name: str, status: bool) -> None
|
|
10
|
+
设置模块的启用状态。
|
|
11
|
+
- 参数:
|
|
12
|
+
- module_name: 模块名称
|
|
13
|
+
- status: 模块状态,True为启用,False为禁用
|
|
14
|
+
- 返回:
|
|
15
|
+
- None
|
|
16
|
+
- 示例:
|
|
17
|
+
```python
|
|
18
|
+
# 启用模块
|
|
19
|
+
sdk.mods.set_module_status("MyModule", True)
|
|
16
20
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
- module_prefix: 模块存储前缀属性
|
|
20
|
-
- status_prefix: 状态存储前缀属性
|
|
21
|
+
# 禁用模块
|
|
22
|
+
sdk.mods.set_module_status("MyModule", False)
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
# 条件性启用模块
|
|
25
|
+
if check_dependencies():
|
|
26
|
+
sdk.mods.set_module_status("MyModule", True)
|
|
27
|
+
else:
|
|
28
|
+
sdk.logger.warning("依赖检查失败,模块未启用")
|
|
29
|
+
```
|
|
23
30
|
|
|
31
|
+
#### get_module_status(module_name: str) -> bool
|
|
32
|
+
获取模块的启用状态。
|
|
33
|
+
- 参数:
|
|
34
|
+
- module_name: 模块名称
|
|
35
|
+
- 返回:
|
|
36
|
+
- bool: 模块状态,True为启用,False为禁用
|
|
37
|
+
- 示例:
|
|
38
|
+
```python
|
|
39
|
+
# 检查模块是否启用
|
|
40
|
+
if sdk.mods.get_module_status("MyModule"):
|
|
41
|
+
print("模块已启用")
|
|
42
|
+
else:
|
|
43
|
+
print("模块已禁用")
|
|
44
|
+
|
|
45
|
+
# 在条件中使用
|
|
46
|
+
if sdk.mods.get_module_status("DatabaseModule") and sdk.mods.get_module_status("NetworkModule"):
|
|
47
|
+
start_application()
|
|
24
48
|
```
|
|
25
|
-
from ErisPulse import sdk
|
|
26
49
|
|
|
27
|
-
|
|
28
|
-
|
|
50
|
+
### 模块信息管理
|
|
51
|
+
#### set_module(module_name: str, module_info: dict) -> None
|
|
52
|
+
设置模块信息。
|
|
53
|
+
- 参数:
|
|
54
|
+
- module_name: 模块名称
|
|
55
|
+
- module_info: 模块信息字典,包含模块的元数据和配置
|
|
56
|
+
- 返回:
|
|
57
|
+
- None
|
|
58
|
+
- 示例:
|
|
59
|
+
```python
|
|
60
|
+
# 设置基本模块信息
|
|
61
|
+
sdk.mods.set_module("MyModule", {
|
|
62
|
+
"status": True,
|
|
63
|
+
"info": {
|
|
64
|
+
"meta": {
|
|
65
|
+
"name": "MyModule",
|
|
66
|
+
"version": "1.0.0",
|
|
67
|
+
"description": "示例模块",
|
|
68
|
+
"author": "开发者"
|
|
69
|
+
},
|
|
70
|
+
"dependencies": {
|
|
71
|
+
"requires": ["CoreModule"],
|
|
72
|
+
"optional": ["OptionalModule"],
|
|
73
|
+
"pip": ["requests", "numpy"]
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
# 更新现有模块信息
|
|
79
|
+
module_info = sdk.mods.get_module("MyModule")
|
|
80
|
+
module_info["info"]["meta"]["version"] = "1.1.0"
|
|
81
|
+
sdk.mods.set_module("MyModule", module_info)
|
|
82
|
+
```
|
|
29
83
|
|
|
84
|
+
#### get_module(module_name: str) -> dict | None
|
|
85
|
+
获取模块信息。
|
|
86
|
+
- 参数:
|
|
87
|
+
- module_name: 模块名称
|
|
88
|
+
- 返回:
|
|
89
|
+
- dict: 模块信息字典
|
|
90
|
+
- None: 如果模块不存在
|
|
91
|
+
- 示例:
|
|
92
|
+
```python
|
|
30
93
|
# 获取模块信息
|
|
31
94
|
module_info = sdk.mods.get_module("MyModule")
|
|
95
|
+
if module_info:
|
|
96
|
+
print(f"模块版本: {module_info['info']['meta']['version']}")
|
|
97
|
+
print(f"模块描述: {module_info['info']['meta']['description']}")
|
|
98
|
+
print(f"模块状态: {'启用' if module_info['status'] else '禁用'}")
|
|
99
|
+
else:
|
|
100
|
+
print("模块不存在")
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
#### get_all_modules() -> dict
|
|
104
|
+
获取所有模块信息。
|
|
105
|
+
- 参数: 无
|
|
106
|
+
- 返回:
|
|
107
|
+
- dict: 包含所有模块信息的字典,键为模块名,值为模块信息
|
|
108
|
+
- 示例:
|
|
109
|
+
```python
|
|
110
|
+
# 获取所有模块
|
|
111
|
+
all_modules = sdk.mods.get_all_modules()
|
|
112
|
+
|
|
113
|
+
# 统计启用和禁用的模块
|
|
114
|
+
enabled_count = 0
|
|
115
|
+
disabled_count = 0
|
|
116
|
+
for name, info in all_modules.items():
|
|
117
|
+
if info.get("status", False):
|
|
118
|
+
enabled_count += 1
|
|
119
|
+
else:
|
|
120
|
+
disabled_count += 1
|
|
121
|
+
|
|
122
|
+
print(f"已启用模块: {enabled_count}")
|
|
123
|
+
print(f"已禁用模块: {disabled_count}")
|
|
124
|
+
|
|
125
|
+
# 查找特定类型的模块
|
|
126
|
+
adapters = [name for name, info in all_modules.items()
|
|
127
|
+
if "adapter" in info.get("info", {}).get("meta", {}).get("tags", [])]
|
|
128
|
+
print(f"适配器模块: {adapters}")
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
#### update_module(module_name: str, module_info: dict) -> None
|
|
132
|
+
更新模块信息。
|
|
133
|
+
- 参数:
|
|
134
|
+
- module_name: 模块名称
|
|
135
|
+
- module_info: 更新后的模块信息字典
|
|
136
|
+
- 返回:
|
|
137
|
+
- None
|
|
138
|
+
- 示例:
|
|
139
|
+
```python
|
|
140
|
+
# 更新模块版本
|
|
141
|
+
module_info = sdk.mods.get_module("MyModule")
|
|
142
|
+
module_info["info"]["meta"]["version"] = "1.2.0"
|
|
143
|
+
sdk.mods.update_module("MyModule", module_info)
|
|
144
|
+
|
|
145
|
+
# 添加新的配置项
|
|
146
|
+
module_info = sdk.mods.get_module("MyModule")
|
|
147
|
+
if "config" not in module_info:
|
|
148
|
+
module_info["config"] = {}
|
|
149
|
+
module_info["config"]["debug_mode"] = True
|
|
150
|
+
sdk.mods.update_module("MyModule", module_info)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
#### remove_module(module_name: str) -> bool
|
|
154
|
+
删除模块。
|
|
155
|
+
- 参数:
|
|
156
|
+
- module_name: 模块名称
|
|
157
|
+
- 返回:
|
|
158
|
+
- bool: 是否成功删除
|
|
159
|
+
- 示例:
|
|
160
|
+
```python
|
|
161
|
+
# 删除模块
|
|
162
|
+
if sdk.mods.remove_module("OldModule"):
|
|
163
|
+
print("模块已成功删除")
|
|
164
|
+
else:
|
|
165
|
+
print("模块不存在或删除失败")
|
|
166
|
+
|
|
167
|
+
# 条件删除
|
|
168
|
+
if sdk.mods.get_module_status("TestModule") and is_test_environment():
|
|
169
|
+
sdk.mods.remove_module("TestModule")
|
|
170
|
+
print("测试模块已在生产环境中移除")
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
#### set_all_modules(modules_info: Dict[str, dict]) -> None
|
|
174
|
+
批量设置多个模块信息。
|
|
175
|
+
- 参数:
|
|
176
|
+
- modules_info: 模块信息字典的字典,键为模块名,值为模块信息
|
|
177
|
+
- 返回:
|
|
178
|
+
- None
|
|
179
|
+
- 示例:
|
|
180
|
+
```python
|
|
181
|
+
# 批量设置模块
|
|
182
|
+
sdk.mods.set_all_modules({
|
|
183
|
+
"Module1": {
|
|
184
|
+
"status": True,
|
|
185
|
+
"info": {"meta": {"name": "Module1", "version": "1.0.0"}}
|
|
186
|
+
},
|
|
187
|
+
"Module2": {
|
|
188
|
+
"status": True,
|
|
189
|
+
"info": {"meta": {"name": "Module2", "version": "1.0.0"}}
|
|
190
|
+
}
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
# 从配置文件加载模块信息
|
|
194
|
+
import json
|
|
195
|
+
with open("modules_config.json", "r") as f:
|
|
196
|
+
modules_config = json.load(f)
|
|
197
|
+
sdk.mods.set_all_modules(modules_config)
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 前缀管理
|
|
201
|
+
#### update_prefixes(module_prefix: str = None, status_prefix: str = None) -> None
|
|
202
|
+
更新存储前缀。
|
|
203
|
+
- 参数:
|
|
204
|
+
- module_prefix: 模块存储前缀
|
|
205
|
+
- status_prefix: 状态存储前缀
|
|
206
|
+
- 返回:
|
|
207
|
+
- None
|
|
208
|
+
- 示例:
|
|
209
|
+
```python
|
|
210
|
+
# 更新模块前缀
|
|
211
|
+
sdk.mods.update_prefixes(module_prefix="custom.module.")
|
|
212
|
+
|
|
213
|
+
# 更新状态前缀
|
|
214
|
+
sdk.mods.update_prefixes(status_prefix="custom.status.")
|
|
215
|
+
|
|
216
|
+
# 同时更新两个前缀
|
|
217
|
+
sdk.mods.update_prefixes(
|
|
218
|
+
module_prefix="app.modules.",
|
|
219
|
+
status_prefix="app.status."
|
|
220
|
+
)
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
#### module_prefix 属性
|
|
224
|
+
获取当前模块存储前缀。
|
|
225
|
+
- 返回:
|
|
226
|
+
- str: 当前模块存储前缀
|
|
227
|
+
- 示例:
|
|
228
|
+
```python
|
|
229
|
+
# 获取当前模块前缀
|
|
230
|
+
prefix = sdk.mods.module_prefix
|
|
231
|
+
print(f"当前模块前缀: {prefix}")
|
|
232
|
+
|
|
233
|
+
# 在自定义存储操作中使用
|
|
234
|
+
custom_key = f"{sdk.mods.module_prefix}custom.{module_name}"
|
|
235
|
+
sdk.env.set(custom_key, custom_data)
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
#### status_prefix 属性
|
|
239
|
+
获取当前状态存储前缀。
|
|
240
|
+
- 返回:
|
|
241
|
+
- str: 当前状态存储前缀
|
|
242
|
+
- 示例:
|
|
243
|
+
```python
|
|
244
|
+
# 获取当前状态前缀
|
|
245
|
+
prefix = sdk.mods.status_prefix
|
|
246
|
+
print(f"当前状态前缀: {prefix}")
|
|
32
247
|
|
|
33
|
-
#
|
|
34
|
-
sdk.mods.
|
|
248
|
+
# 在自定义状态操作中使用
|
|
249
|
+
custom_status_key = f"{sdk.mods.status_prefix}custom.{module_name}"
|
|
250
|
+
sdk.env.set(custom_status_key, is_active)
|
|
35
251
|
```
|
|
36
252
|
|
|
37
253
|
"""
|
ErisPulse/raiserr.py
CHANGED
|
@@ -1,34 +1,69 @@
|
|
|
1
1
|
"""
|
|
2
2
|
# 错误管理系统
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
提供错误类型注册、抛出和管理功能,集成全局异常处理。支持自定义错误类型、错误链追踪和全局异常捕获。
|
|
5
5
|
|
|
6
6
|
## API 文档
|
|
7
|
-
### 错误注册:
|
|
8
|
-
- register(name, doc="", base=Exception): 注册新的错误类型
|
|
9
|
-
- info(name: str = None): 获取错误类型信息
|
|
10
|
-
|
|
11
|
-
### 错误抛出:
|
|
12
|
-
- __getattr__(name): 动态获取错误抛出函数
|
|
13
|
-
- ErrorType(msg, exit=False): 抛出注册的错误类型
|
|
14
|
-
|
|
15
|
-
### 全局处理:
|
|
16
|
-
- global_exception_handler: 全局同步异常处理器
|
|
17
|
-
- async_exception_handler: 全局异步异常处理器
|
|
18
|
-
|
|
19
|
-
### 示例用法:
|
|
20
7
|
|
|
8
|
+
### 错误注册
|
|
9
|
+
#### register(name: str, doc: str = "", base: type = Exception) -> type
|
|
10
|
+
注册新的错误类型。
|
|
11
|
+
- 参数:
|
|
12
|
+
- name: 错误类型名称
|
|
13
|
+
- doc: 错误描述文档
|
|
14
|
+
- base: 基础异常类,默认为Exception
|
|
15
|
+
- 返回:
|
|
16
|
+
- type: 注册的错误类型类
|
|
17
|
+
- 示例:
|
|
18
|
+
```python
|
|
19
|
+
# 注册一个简单错误
|
|
20
|
+
sdk.raiserr.register("SimpleError", "简单的错误类型")
|
|
21
|
+
|
|
22
|
+
# 注册带有自定义基类的错误
|
|
23
|
+
class CustomBase(Exception):
|
|
24
|
+
pass
|
|
25
|
+
sdk.raiserr.register("AdvancedError", "高级错误", CustomBase)
|
|
21
26
|
```
|
|
22
|
-
from ErisPulse import sdk
|
|
23
27
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
#### info(name: str = None) -> dict | None
|
|
29
|
+
获取错误类型信息。
|
|
30
|
+
- 参数:
|
|
31
|
+
- name: 错误类型名称,如果为None则返回所有错误类型信息
|
|
32
|
+
- 返回:
|
|
33
|
+
- dict: 包含错误类型信息的字典,包括类型名、文档和类引用
|
|
34
|
+
- None: 如果指定的错误类型不存在
|
|
35
|
+
- 示例:
|
|
36
|
+
```python
|
|
37
|
+
# 获取特定错误信息
|
|
38
|
+
error_info = sdk.raiserr.info("SimpleError")
|
|
39
|
+
print(f"错误类型: {error_info['type']}")
|
|
40
|
+
print(f"错误描述: {error_info['doc']}")
|
|
41
|
+
|
|
42
|
+
# 获取所有注册的错误信息
|
|
43
|
+
all_errors = sdk.raiserr.info()
|
|
44
|
+
for name, info in all_errors.items():
|
|
45
|
+
print(f"{name}: {info['doc']}")
|
|
46
|
+
```
|
|
29
47
|
|
|
30
|
-
|
|
31
|
-
|
|
48
|
+
### 错误抛出
|
|
49
|
+
#### ErrorType(msg: str, exit: bool = False)
|
|
50
|
+
动态生成的错误抛出函数。
|
|
51
|
+
- 参数:
|
|
52
|
+
- msg: 错误消息
|
|
53
|
+
- exit: 是否在抛出错误后退出程序
|
|
54
|
+
- 示例:
|
|
55
|
+
```python
|
|
56
|
+
# 抛出不退出的错误
|
|
57
|
+
sdk.raiserr.SimpleError("操作失败")
|
|
58
|
+
|
|
59
|
+
# 抛出导致程序退出的错误
|
|
60
|
+
sdk.raiserr.CriticalError("致命错误", exit=True)
|
|
61
|
+
|
|
62
|
+
# 带有异常捕获的使用方式
|
|
63
|
+
try:
|
|
64
|
+
sdk.raiserr.ValidationError("数据验证失败")
|
|
65
|
+
except Exception as e:
|
|
66
|
+
print(f"捕获到错误: {e}")
|
|
32
67
|
```
|
|
33
68
|
|
|
34
69
|
"""
|
|
@@ -86,24 +121,16 @@ raiserr = Error()
|
|
|
86
121
|
|
|
87
122
|
# 全局异常处理器
|
|
88
123
|
def global_exception_handler(exc_type, exc_value, exc_traceback):
|
|
89
|
-
from .logger import logger
|
|
90
124
|
error_message = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
f"检测到外部异常,请优先使用 sdk.raiserr 抛出错误。\n原始异常: {exc_type.__name__}: {exc_value}\nTraceback:\n{error_message}"
|
|
125
|
+
raiserr.ExternalError(
|
|
126
|
+
f"{exc_type.__name__}: {exc_value}\nTraceback:\n{error_message}"
|
|
94
127
|
)
|
|
95
|
-
sys.excepthook = global_exception_handler
|
|
96
|
-
|
|
97
128
|
def async_exception_handler(loop, context):
|
|
98
|
-
from .logger import logger
|
|
99
129
|
exception = context.get('exception')
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
)
|
|
107
|
-
else:
|
|
108
|
-
logger.warning(f"异步任务警告: {message}")
|
|
130
|
+
tb = ''.join(traceback.format_exception(type(exception), exception, exception.__traceback__))
|
|
131
|
+
raiserr.ExternalError(
|
|
132
|
+
f"{type(exception).__name__}: {exception}\nTraceback:\n{tb}"
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
sys.excepthook = global_exception_handler
|
|
109
136
|
asyncio.get_event_loop().set_exception_handler(async_exception_handler)
|