ErisPulse 1.1.15__py3-none-any.whl → 1.2.0__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 +245 -165
- ErisPulse/__main__.py +20 -22
- ErisPulse/adapter.py +0 -125
- ErisPulse/db.py +0 -60
- ErisPulse/logger.py +7 -241
- ErisPulse/mods.py +0 -77
- ErisPulse/raiserr.py +8 -104
- {erispulse-1.1.15.dist-info → erispulse-1.2.0.dist-info}/METADATA +78 -45
- erispulse-1.2.0.dist-info/RECORD +13 -0
- erispulse-1.1.15.dist-info/RECORD +0 -13
- {erispulse-1.1.15.dist-info → erispulse-1.2.0.dist-info}/WHEEL +0 -0
- {erispulse-1.1.15.dist-info → erispulse-1.2.0.dist-info}/entry_points.txt +0 -0
- {erispulse-1.1.15.dist-info → erispulse-1.2.0.dist-info}/licenses/LICENSE +0 -0
ErisPulse/db.py
CHANGED
|
@@ -3,13 +3,6 @@
|
|
|
3
3
|
|
|
4
4
|
提供键值存储、事务支持、快照和恢复功能,用于管理框架配置数据。基于SQLite实现持久化存储,支持复杂数据类型和原子操作。
|
|
5
5
|
|
|
6
|
-
## 核心功能
|
|
7
|
-
1. 键值存储
|
|
8
|
-
2. 事务支持
|
|
9
|
-
3. 数据库快照
|
|
10
|
-
4. 自动备份
|
|
11
|
-
5. 配置文件集成
|
|
12
|
-
|
|
13
6
|
## API 文档
|
|
14
7
|
|
|
15
8
|
### 基本操作
|
|
@@ -431,27 +424,6 @@ def safe_bulk_update(updates):
|
|
|
431
424
|
raise
|
|
432
425
|
```
|
|
433
426
|
|
|
434
|
-
## 注意事项
|
|
435
|
-
|
|
436
|
-
1. 性能优化
|
|
437
|
-
- 使用批量操作代替多次单独操作
|
|
438
|
-
- 合理使用事务减少数据库操作次数
|
|
439
|
-
- 避免存储过大的值,考虑分片存储
|
|
440
|
-
|
|
441
|
-
2. 数据安全
|
|
442
|
-
- 定期创建快照备份重要数据
|
|
443
|
-
- 使用事务确保数据一致性
|
|
444
|
-
- 不要存储敏感信息(如密码)的明文
|
|
445
|
-
|
|
446
|
-
3. 配置管理
|
|
447
|
-
- 使用有意义的键名和层次结构
|
|
448
|
-
- 记录配置的更新历史
|
|
449
|
-
- 定期清理不再使用的配置
|
|
450
|
-
|
|
451
|
-
4. 错误处理
|
|
452
|
-
- 所有数据库操作都应该有错误处理
|
|
453
|
-
- 重要操作前创建快照以便回滚
|
|
454
|
-
- 记录所有关键操作的日志
|
|
455
427
|
"""
|
|
456
428
|
|
|
457
429
|
import os
|
|
@@ -674,38 +646,6 @@ class EnvManager:
|
|
|
674
646
|
for key, value in vars(env_module).items():
|
|
675
647
|
if not key.startswith("__") and isinstance(value, (dict, list, str, int, float, bool)):
|
|
676
648
|
self.set(key, value)
|
|
677
|
-
|
|
678
|
-
def create_env_file_if_not_exists(self):
|
|
679
|
-
env_file = Path("env.py")
|
|
680
|
-
if not env_file.exists():
|
|
681
|
-
content = '''# env.py
|
|
682
|
-
# ErisPulse 环境配置文件
|
|
683
|
-
# 本文件由 SDK 自动创建,请勿随意删除
|
|
684
|
-
# 配置项可通过 sdk.env.get(key, default) 获取,或使用 sdk.env.set(key, value) 设置
|
|
685
|
-
# 你也可以像写普通变量一样直接定义配置项,例如:
|
|
686
|
-
#
|
|
687
|
-
# MY_CONFIG = "value"
|
|
688
|
-
# MY_CONFIG_2 = {"key": "value"}
|
|
689
|
-
# MY_CONFIG_3 = [1, 2, 3]
|
|
690
|
-
#
|
|
691
|
-
# sdk.env.set("MY_CONFIG", "value")
|
|
692
|
-
# sdk.env.set("MY_CONFIG_2", {"key": "value"})
|
|
693
|
-
# sdk.env.set("MY_CONFIG_3", [1, 2, 3])
|
|
694
|
-
#
|
|
695
|
-
# 这些变量会自动被加载到 SDK 的配置系统中,可通过 sdk.env.MY_CONFIG 或 sdk.env.get("MY_CONFIG") 访问。
|
|
696
|
-
|
|
697
|
-
from ErisPulse import sdk
|
|
698
|
-
'''
|
|
699
|
-
try:
|
|
700
|
-
with open(env_file, "w", encoding="utf-8") as f:
|
|
701
|
-
f.write(content)
|
|
702
|
-
return True
|
|
703
|
-
except Exception as e:
|
|
704
|
-
from . import sdk
|
|
705
|
-
sdk.logger.error(f"无法创建 env.py 文件: {e}")
|
|
706
|
-
return False
|
|
707
|
-
return False
|
|
708
|
-
|
|
709
649
|
def __getattr__(self, key):
|
|
710
650
|
try:
|
|
711
651
|
return self.get(key)
|
ErisPulse/logger.py
CHANGED
|
@@ -3,62 +3,16 @@
|
|
|
3
3
|
|
|
4
4
|
提供模块化、多级别的日志记录功能,支持内存存储和文件输出。实现了模块级别的日志控制、彩色输出和灵活的存储选项。
|
|
5
5
|
|
|
6
|
-
## 核心功能
|
|
7
|
-
1. 多级别日志记录
|
|
8
|
-
2. 模块级别日志控制
|
|
9
|
-
3. 内存日志存储
|
|
10
|
-
4. 文件输出支持
|
|
11
|
-
5. 自动调用者识别
|
|
12
|
-
6. 异常捕获装饰器
|
|
13
|
-
|
|
14
6
|
## API 文档
|
|
15
7
|
|
|
16
8
|
### 基本日志操作
|
|
17
|
-
#### debug(msg: str, *args, **kwargs) -> None
|
|
18
|
-
记录调试级别的日志信息。
|
|
19
|
-
- 参数:
|
|
20
|
-
- msg: 日志消息
|
|
21
|
-
- *args: 传递给底层logger的位置参数
|
|
22
|
-
- **kwargs: 传递给底层logger的关键字参数
|
|
23
|
-
- 返回:
|
|
24
|
-
- None
|
|
25
|
-
- 示例:
|
|
26
|
-
```python
|
|
27
|
-
# 基本调试信息
|
|
28
|
-
sdk.logger.debug("初始化配置")
|
|
29
9
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
sdk.logger.debug(f"读取配置: timeout = {config_value}")
|
|
10
|
+
以debug为例:
|
|
11
|
+
> 此外,还有其他级别的日志记录函数,如info, warning, error, critical等,用法相同。
|
|
33
12
|
|
|
34
|
-
|
|
35
|
-
if is_development_mode():
|
|
36
|
-
sdk.logger.debug("开发模式下的详细信息: %s", detailed_info)
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
#### info(msg: str, *args, **kwargs) -> None
|
|
40
|
-
记录信息级别的日志信息。
|
|
41
|
-
- 参数:
|
|
42
|
-
- msg: 日志消息
|
|
43
|
-
- *args: 传递给底层logger的位置参数
|
|
44
|
-
- **kwargs: 传递给底层logger的关键字参数
|
|
45
|
-
- 返回:
|
|
46
|
-
- None
|
|
47
|
-
- 示例:
|
|
48
|
-
```python
|
|
49
|
-
# 基本信息记录
|
|
50
|
-
sdk.logger.info("应用已启动")
|
|
13
|
+
debug(msg: str, *args, **kwargs) -> None
|
|
51
14
|
|
|
52
|
-
|
|
53
|
-
user_count = get_active_users()
|
|
54
|
-
sdk.logger.info(f"当前活跃用户: {user_count}")
|
|
55
|
-
|
|
56
|
-
# 记录操作结果
|
|
57
|
-
sdk.logger.info("数据导入完成,共处理 %d 条记录", record_count)
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
#### warning(msg: str, *args, **kwargs) -> None
|
|
61
|
-
记录警告级别的日志信息。
|
|
15
|
+
记录调试级别的日志信息。
|
|
62
16
|
- 参数:
|
|
63
17
|
- msg: 日志消息
|
|
64
18
|
- *args: 传递给底层logger的位置参数
|
|
@@ -66,64 +20,9 @@ sdk.logger.info("数据导入完成,共处理 %d 条记录", record_count)
|
|
|
66
20
|
- 返回:
|
|
67
21
|
- None
|
|
68
22
|
- 示例:
|
|
69
|
-
```python
|
|
70
|
-
# 基本警告信息
|
|
71
|
-
sdk.logger.warning("配置文件未找到,使用默认配置")
|
|
72
23
|
|
|
73
|
-
# 性能警告
|
|
74
|
-
if response_time > threshold:
|
|
75
|
-
sdk.logger.warning(f"响应时间过长: {response_time}ms > {threshold}ms")
|
|
76
|
-
|
|
77
|
-
# 资源使用警告
|
|
78
|
-
memory_usage = get_memory_usage()
|
|
79
|
-
if memory_usage > 80:
|
|
80
|
-
sdk.logger.warning("内存使用率高: %d%%", memory_usage)
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
#### error(msg: str, *args, **kwargs) -> None
|
|
84
|
-
记录错误级别的日志信息。
|
|
85
|
-
- 参数:
|
|
86
|
-
- msg: 日志消息
|
|
87
|
-
- *args: 传递给底层logger的位置参数
|
|
88
|
-
- **kwargs: 传递给底层logger的关键字参数
|
|
89
|
-
- 返回:
|
|
90
|
-
- None
|
|
91
|
-
- 示例:
|
|
92
24
|
```python
|
|
93
|
-
|
|
94
|
-
sdk.logger.error("数据库连接失败")
|
|
95
|
-
|
|
96
|
-
# 带有异常信息的错误
|
|
97
|
-
try:
|
|
98
|
-
process_data()
|
|
99
|
-
except Exception as e:
|
|
100
|
-
sdk.logger.error(f"数据处理错误: {str(e)}")
|
|
101
|
-
|
|
102
|
-
# 带有错误代码的错误
|
|
103
|
-
sdk.logger.error("API请求失败,状态码: %d, 错误: %s", status_code, error_message)
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
#### critical(msg: str, *args, **kwargs) -> None
|
|
107
|
-
记录致命错误级别的日志信息,并终止程序。
|
|
108
|
-
- 参数:
|
|
109
|
-
- msg: 日志消息
|
|
110
|
-
- *args: 传递给底层logger的位置参数
|
|
111
|
-
- **kwargs: 传递给底层logger的关键字参数
|
|
112
|
-
- 返回:
|
|
113
|
-
- None (程序会终止)
|
|
114
|
-
- 示例:
|
|
115
|
-
```python
|
|
116
|
-
# 致命错误记录
|
|
117
|
-
if not database_connection:
|
|
118
|
-
sdk.logger.critical("无法连接到主数据库,应用无法继续运行")
|
|
119
|
-
|
|
120
|
-
# 安全相关的致命错误
|
|
121
|
-
if security_breach_detected():
|
|
122
|
-
sdk.logger.critical("检测到安全漏洞,强制关闭系统")
|
|
123
|
-
|
|
124
|
-
# 资源耗尽的致命错误
|
|
125
|
-
if disk_space < min_required:
|
|
126
|
-
sdk.logger.critical("磁盘空间不足 (%dMB),无法继续运行", disk_space)
|
|
25
|
+
sdk.logger.debug("这是一条日志")
|
|
127
26
|
```
|
|
128
27
|
|
|
129
28
|
### 日志级别控制
|
|
@@ -214,118 +113,11 @@ import atexit
|
|
|
214
113
|
atexit.register(lambda: sdk.logger.save_logs("final_logs.txt"))
|
|
215
114
|
```
|
|
216
115
|
|
|
217
|
-
### 异常捕获 (准备弃用)
|
|
218
|
-
#### catch(func_or_level=None, level="error")
|
|
219
|
-
异常捕获装饰器。
|
|
220
|
-
- 参数:
|
|
221
|
-
- func_or_level: 要装饰的函数或日志级别
|
|
222
|
-
- level: 捕获异常时使用的日志级别
|
|
223
|
-
- 返回:
|
|
224
|
-
- function: 装饰后的函数
|
|
225
|
-
- 注意:
|
|
226
|
-
- 此功能已集成到 raiserr 模块中,建议使用 raiserr 进行异常处理
|
|
227
|
-
- 示例:
|
|
228
|
-
```python
|
|
229
|
-
# 基本用法 (不推荐,请使用raiserr)
|
|
230
|
-
@sdk.logger.catch
|
|
231
|
-
def risky_function():
|
|
232
|
-
# 可能抛出异常的代码
|
|
233
|
-
process_data()
|
|
234
|
-
|
|
235
|
-
# 指定日志级别 (不推荐,请使用raiserr)
|
|
236
|
-
@sdk.logger.catch(level="critical")
|
|
237
|
-
def very_important_function():
|
|
238
|
-
# 关键操作
|
|
239
|
-
update_database()
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
## 最佳实践
|
|
243
|
-
1. 日志级别使用
|
|
244
|
-
```python
|
|
245
|
-
# 开发环境使用详细日志
|
|
246
|
-
if is_development():
|
|
247
|
-
sdk.logger.set_level("DEBUG")
|
|
248
|
-
sdk.logger.debug("详细的调试信息")
|
|
249
|
-
else:
|
|
250
|
-
sdk.logger.set_level("INFO")
|
|
251
|
-
|
|
252
|
-
# 性能敏感模块使用更高级别
|
|
253
|
-
sdk.logger.set_module_level("PerformanceModule", "WARNING")
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
2. 结构化日志信息
|
|
257
|
-
```python
|
|
258
|
-
# 使用一致的格式
|
|
259
|
-
def log_api_request(endpoint, method, status, duration):
|
|
260
|
-
sdk.logger.info(
|
|
261
|
-
f"API请求: {method} {endpoint} - 状态: {status}, 耗时: {duration}ms"
|
|
262
|
-
)
|
|
263
|
-
|
|
264
|
-
# 包含关键上下文
|
|
265
|
-
def log_user_action(user_id, action, result):
|
|
266
|
-
sdk.logger.info(
|
|
267
|
-
f"用户操作: [用户:{user_id}] {action} - 结果: {result}"
|
|
268
|
-
)
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
3. 日志文件管理
|
|
272
|
-
```python
|
|
273
|
-
# 按日期分割日志文件
|
|
274
|
-
from datetime import datetime
|
|
275
|
-
import os
|
|
276
|
-
|
|
277
|
-
def setup_logging():
|
|
278
|
-
log_dir = "logs"
|
|
279
|
-
os.makedirs(log_dir, exist_ok=True)
|
|
280
|
-
|
|
281
|
-
today = datetime.now().strftime("%Y-%m-%d")
|
|
282
|
-
log_file = os.path.join(log_dir, f"app_{today}.log")
|
|
283
|
-
|
|
284
|
-
sdk.logger.set_output_file(log_file)
|
|
285
|
-
sdk.logger.info(f"日志文件已设置: {log_file}")
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
4. 异常处理与日志
|
|
289
|
-
```python
|
|
290
|
-
# 推荐方式:使用raiserr结合logger
|
|
291
|
-
def process_with_logging():
|
|
292
|
-
try:
|
|
293
|
-
result = perform_operation()
|
|
294
|
-
sdk.logger.info(f"操作成功: {result}")
|
|
295
|
-
return result
|
|
296
|
-
except Exception as e:
|
|
297
|
-
sdk.logger.error(f"操作失败: {str(e)}")
|
|
298
|
-
sdk.raiserr.OperationError(f"处理失败: {str(e)}")
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
## 注意事项
|
|
302
|
-
1. 日志级别选择
|
|
303
|
-
- DEBUG: 详细的调试信息,仅在开发环境使用
|
|
304
|
-
- INFO: 常规操作信息,适用于生产环境
|
|
305
|
-
- WARNING: 潜在问题或异常情况
|
|
306
|
-
- ERROR: 错误但不影响整体功能
|
|
307
|
-
- CRITICAL: 致命错误,导致程序终止
|
|
308
|
-
|
|
309
|
-
2. 性能考虑
|
|
310
|
-
- 避免在高频循环中记录过多日志
|
|
311
|
-
- 使用适当的日志级别减少不必要的输出
|
|
312
|
-
- 考虑日志文件大小和轮转策略
|
|
313
|
-
|
|
314
|
-
3. 敏感信息保护
|
|
315
|
-
- 不要记录密码、令牌等敏感信息
|
|
316
|
-
- 在记录用户数据前进行脱敏处理
|
|
317
|
-
- 遵循数据保护法规要求
|
|
318
|
-
|
|
319
|
-
4. 迁移建议
|
|
320
|
-
- 从catch装饰器迁移到raiserr模块
|
|
321
|
-
- 使用结构化的错误处理方式
|
|
322
|
-
- 结合日志和错误管理实现完整的异常处理流程
|
|
323
116
|
"""
|
|
324
117
|
|
|
325
118
|
import logging
|
|
326
119
|
import inspect
|
|
327
120
|
import datetime
|
|
328
|
-
import functools
|
|
329
121
|
|
|
330
122
|
class Logger:
|
|
331
123
|
def __init__(self):
|
|
@@ -395,34 +187,6 @@ class Logger:
|
|
|
395
187
|
self._logger.error(f"无法保存日志到 {p}: {e}。")
|
|
396
188
|
raise e
|
|
397
189
|
|
|
398
|
-
def catch(self, func_or_level=None, level="error"):
|
|
399
|
-
if isinstance(func_or_level, str):
|
|
400
|
-
return lambda func: self.catch(func, level=func_or_level)
|
|
401
|
-
if func_or_level is None:
|
|
402
|
-
return lambda func: self.catch(func, level=level)
|
|
403
|
-
func = func_or_level
|
|
404
|
-
|
|
405
|
-
@functools.wraps(func)
|
|
406
|
-
def wrapper(*args, **kwargs):
|
|
407
|
-
try:
|
|
408
|
-
return func(*args, **kwargs)
|
|
409
|
-
except Exception as e:
|
|
410
|
-
import traceback
|
|
411
|
-
error_info = traceback.format_exc()
|
|
412
|
-
|
|
413
|
-
module_name = func.__module__
|
|
414
|
-
if module_name == "__main__":
|
|
415
|
-
module_name = "Main"
|
|
416
|
-
func_name = func.__name__
|
|
417
|
-
|
|
418
|
-
error_msg = f"Exception in {func_name}: {str(e)}\n{error_info}"
|
|
419
|
-
|
|
420
|
-
log_method = getattr(self, level, self.error)
|
|
421
|
-
log_method(error_msg)
|
|
422
|
-
|
|
423
|
-
return None
|
|
424
|
-
return wrapper
|
|
425
|
-
|
|
426
190
|
def _save_in_memory(self, ModuleName, msg):
|
|
427
191
|
if ModuleName not in self._logs:
|
|
428
192
|
self._logs[ModuleName] = []
|
|
@@ -441,6 +205,8 @@ class Logger:
|
|
|
441
205
|
module_name = "Main"
|
|
442
206
|
if module_name.endswith(".Core"):
|
|
443
207
|
module_name = module_name[:-5]
|
|
208
|
+
if module_name.startswith("ErisPulse"):
|
|
209
|
+
module_name = "ErisPulse"
|
|
444
210
|
return module_name
|
|
445
211
|
|
|
446
212
|
def debug(self, msg, *args, **kwargs):
|
ErisPulse/mods.py
CHANGED
|
@@ -3,13 +3,6 @@
|
|
|
3
3
|
|
|
4
4
|
提供模块的注册、状态管理和依赖解析功能。支持模块信息存储、状态切换和批量操作。
|
|
5
5
|
|
|
6
|
-
## 核心功能
|
|
7
|
-
1. 模块信息管理
|
|
8
|
-
2. 模块状态控制
|
|
9
|
-
3. 批量模块操作
|
|
10
|
-
4. 存储前缀自定义
|
|
11
|
-
5. 模块依赖管理
|
|
12
|
-
|
|
13
6
|
## API 文档
|
|
14
7
|
|
|
15
8
|
### 模块状态管理
|
|
@@ -257,76 +250,6 @@ custom_status_key = f"{sdk.mods.status_prefix}custom.{module_name}"
|
|
|
257
250
|
sdk.env.set(custom_status_key, is_active)
|
|
258
251
|
```
|
|
259
252
|
|
|
260
|
-
## 最佳实践
|
|
261
|
-
1. 模块信息结构
|
|
262
|
-
```python
|
|
263
|
-
# 推荐的模块信息结构
|
|
264
|
-
module_info = {
|
|
265
|
-
"status": True, # 模块启用状态
|
|
266
|
-
"info": {
|
|
267
|
-
"meta": {
|
|
268
|
-
"name": "ModuleName", # 模块名称
|
|
269
|
-
"version": "1.0.0", # 模块版本
|
|
270
|
-
"description": "模块描述",
|
|
271
|
-
"author": "作者",
|
|
272
|
-
"license": "MIT",
|
|
273
|
-
"tags": ["tag1", "tag2"] # 分类标签
|
|
274
|
-
},
|
|
275
|
-
"dependencies": {
|
|
276
|
-
"requires": ["RequiredModule1"], # 必需依赖
|
|
277
|
-
"optional": ["OptionalModule1"], # 可选依赖
|
|
278
|
-
"pip": ["package1", "package2"] # pip包依赖
|
|
279
|
-
}
|
|
280
|
-
},
|
|
281
|
-
"config": { # 模块配置(可选)
|
|
282
|
-
"setting1": "value1",
|
|
283
|
-
"setting2": "value2"
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
```
|
|
287
|
-
|
|
288
|
-
2. 模块状态管理
|
|
289
|
-
```python
|
|
290
|
-
# 根据条件启用/禁用模块
|
|
291
|
-
def toggle_modules_by_environment():
|
|
292
|
-
env_type = get_environment_type()
|
|
293
|
-
|
|
294
|
-
# 开发环境启用调试模块
|
|
295
|
-
if env_type == "development":
|
|
296
|
-
sdk.mods.set_module_status("DebugModule", True)
|
|
297
|
-
sdk.mods.set_module_status("PerformanceModule", False)
|
|
298
|
-
|
|
299
|
-
# 生产环境禁用调试模块,启用性能模块
|
|
300
|
-
elif env_type == "production":
|
|
301
|
-
sdk.mods.set_module_status("DebugModule", False)
|
|
302
|
-
sdk.mods.set_module_status("PerformanceModule", True)
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
3. 模块依赖检查
|
|
306
|
-
```python
|
|
307
|
-
# 检查模块依赖
|
|
308
|
-
def check_module_dependencies(module_name):
|
|
309
|
-
module_info = sdk.mods.get_module(module_name)
|
|
310
|
-
if not module_info:
|
|
311
|
-
return False
|
|
312
|
-
|
|
313
|
-
dependencies = module_info.get("info", {}).get("dependencies", {}).get("requires", [])
|
|
314
|
-
|
|
315
|
-
for dep in dependencies:
|
|
316
|
-
dep_info = sdk.mods.get_module(dep)
|
|
317
|
-
if not dep_info or not dep_info.get("status", False):
|
|
318
|
-
sdk.logger.warning(f"模块 {module_name} 的依赖 {dep} 未启用或不存在")
|
|
319
|
-
return False
|
|
320
|
-
|
|
321
|
-
return True
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
## 注意事项
|
|
325
|
-
1. 模块名称应唯一,避免冲突
|
|
326
|
-
2. 模块信息结构应保持一致,便于管理
|
|
327
|
-
3. 更新模块信息前应先获取现有信息,避免覆盖
|
|
328
|
-
4. 批量操作时注意性能影响
|
|
329
|
-
5. 自定义前缀时确保不与系统其他键冲突
|
|
330
253
|
"""
|
|
331
254
|
|
|
332
255
|
import json
|
ErisPulse/raiserr.py
CHANGED
|
@@ -3,13 +3,6 @@
|
|
|
3
3
|
|
|
4
4
|
提供错误类型注册、抛出和管理功能,集成全局异常处理。支持自定义错误类型、错误链追踪和全局异常捕获。
|
|
5
5
|
|
|
6
|
-
## 核心功能
|
|
7
|
-
1. 错误类型注册和管理
|
|
8
|
-
2. 动态错误抛出
|
|
9
|
-
3. 全局异常处理
|
|
10
|
-
4. 错误信息追踪
|
|
11
|
-
5. 异步错误处理
|
|
12
|
-
|
|
13
6
|
## API 文档
|
|
14
7
|
|
|
15
8
|
### 错误注册
|
|
@@ -73,87 +66,6 @@ except Exception as e:
|
|
|
73
66
|
print(f"捕获到错误: {e}")
|
|
74
67
|
```
|
|
75
68
|
|
|
76
|
-
### 全局异常处理
|
|
77
|
-
#### global_exception_handler(exc_type: type, exc_value: Exception, exc_traceback: traceback)
|
|
78
|
-
全局同步异常处理器。
|
|
79
|
-
- 参数:
|
|
80
|
-
- exc_type: 异常类型
|
|
81
|
-
- exc_value: 异常值
|
|
82
|
-
- exc_traceback: 异常追踪信息
|
|
83
|
-
- 示例:
|
|
84
|
-
```python
|
|
85
|
-
# 系统会自动捕获未处理的异常
|
|
86
|
-
def risky_operation():
|
|
87
|
-
raise Exception("未处理的异常")
|
|
88
|
-
|
|
89
|
-
# 异常会被global_exception_handler捕获并处理
|
|
90
|
-
risky_operation()
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
#### async_exception_handler(loop: asyncio.AbstractEventLoop, context: dict)
|
|
94
|
-
全局异步异常处理器。
|
|
95
|
-
- 参数:
|
|
96
|
-
- loop: 事件循环实例
|
|
97
|
-
- context: 异常上下文信息
|
|
98
|
-
- 示例:
|
|
99
|
-
```python
|
|
100
|
-
async def async_operation():
|
|
101
|
-
raise Exception("异步操作错误")
|
|
102
|
-
|
|
103
|
-
# 异常会被async_exception_handler捕获并处理
|
|
104
|
-
asyncio.create_task(async_operation())
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## 最佳实践
|
|
108
|
-
1. 错误类型注册
|
|
109
|
-
```python
|
|
110
|
-
# 为特定功能模块注册错误类型
|
|
111
|
-
sdk.raiserr.register("DatabaseError", "数据库操作错误")
|
|
112
|
-
sdk.raiserr.register("NetworkError", "网络连接错误")
|
|
113
|
-
sdk.raiserr.register("ValidationError", "数据验证错误")
|
|
114
|
-
|
|
115
|
-
# 使用继承关系组织错误类型
|
|
116
|
-
class ModuleError(Exception):
|
|
117
|
-
pass
|
|
118
|
-
sdk.raiserr.register("ConfigError", "配置错误", ModuleError)
|
|
119
|
-
sdk.raiserr.register("PluginError", "插件错误", ModuleError)
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
2. 错误处理流程
|
|
123
|
-
```python
|
|
124
|
-
def process_data(data):
|
|
125
|
-
try:
|
|
126
|
-
if not data:
|
|
127
|
-
sdk.raiserr.ValidationError("数据不能为空")
|
|
128
|
-
if not isinstance(data, dict):
|
|
129
|
-
sdk.raiserr.ValidationError("数据必须是字典类型")
|
|
130
|
-
|
|
131
|
-
# 处理数据...
|
|
132
|
-
|
|
133
|
-
except Exception as e:
|
|
134
|
-
# 错误会被自动记录并处理
|
|
135
|
-
sdk.raiserr.ProcessingError(f"数据处理失败: {str(e)}")
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
3. 异步环境使用
|
|
139
|
-
```python
|
|
140
|
-
async def async_task():
|
|
141
|
-
try:
|
|
142
|
-
result = await some_async_operation()
|
|
143
|
-
if not result.success:
|
|
144
|
-
sdk.raiserr.AsyncOperationError("异步操作失败")
|
|
145
|
-
except Exception as e:
|
|
146
|
-
# 异步错误会被async_exception_handler捕获
|
|
147
|
-
raise
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
## 注意事项
|
|
151
|
-
1. 错误类型命名应具有描述性,便于理解错误来源
|
|
152
|
-
2. 错误消息应包含足够的上下文信息,便于调试
|
|
153
|
-
3. 适当使用exit参数,只在致命错误时设置为True
|
|
154
|
-
4. 避免在全局异常处理器中执行耗时操作
|
|
155
|
-
5. 确保异步代码中的错误能够被正确捕获和处理
|
|
156
|
-
|
|
157
69
|
"""
|
|
158
70
|
|
|
159
71
|
import sys
|
|
@@ -209,24 +121,16 @@ raiserr = Error()
|
|
|
209
121
|
|
|
210
122
|
# 全局异常处理器
|
|
211
123
|
def global_exception_handler(exc_type, exc_value, exc_traceback):
|
|
212
|
-
from .logger import logger
|
|
213
124
|
error_message = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
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}"
|
|
217
127
|
)
|
|
218
|
-
sys.excepthook = global_exception_handler
|
|
219
|
-
|
|
220
128
|
def async_exception_handler(loop, context):
|
|
221
|
-
from .logger import logger
|
|
222
129
|
exception = context.get('exception')
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
)
|
|
230
|
-
else:
|
|
231
|
-
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
|
|
232
136
|
asyncio.get_event_loop().set_exception_handler(async_exception_handler)
|