ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Monty错误处理完全指南:5大异常类型、Traceback解析与display()格式

Monty错误处理完全指南:5大异常类型、Traceback解析与display()格式 Monty错误处理完全指南5大异常类型、Traceback解析与display()格式【免费下载链接】montyA minimal, secure Python interpreter written in Rust for use by AI项目地址: https://gitcode.com/GitHub_Trending/monty3/montyMonty 是一个用 Rust 编写的极简、安全 Python 解释器专为 AI 场景设计。所有代码都在独立的沙箱子进程中执行因此如何优雅地接住沙箱抛出的错误是每个使用者的必修课。本指南带你快速掌握 Monty 的 5 大异常类型、Traceback 帧解析以及display()的三种输出格式帮助你在生产环境中稳定捕获和展示沙箱错误。Monty 异常体系一张图看懂 5 大异常类型Monty 的所有解释器错误都继承自同一个基类MontyError只要except MontyError就能一网打尽。其完整层级定义在源码 crates/monty-python/src/exceptions.rs 中异常类触发时机典型应对MontySyntaxErrorPython 代码语法错误或无法被解析提示用户修正代码MontyRuntimeError代码执行期间失败除零、KeyError 等展示 Traceback会话可继续MontyTypingError开启类型检查后检查器拒绝该代码片段展示渲染好的诊断信息MontyCrashedError沙箱进程死亡或超时被看门狗终止捕获后重试或上报MontyDisconnectError远程 Worker 连接中断WebSocket 场景在新会话中重试 另有两位近亲MontyShutdown远程服务器正在关闭请求未执行可安全重跑和MontyConversionError宿主值无法转换进沙箱。两者同样继承MontyError。读懂 MontyRuntimeErrorexception() 还原真实异常这是最常用的一类错误。以1 / 0为例沙箱内部抛出的是标准 Python 的ZeroDivisionError它被 Monty 包装成MontyRuntimeError抛给宿主from pydantic_monty import Monty, MontyError with Monty() as pool: with pool.checkout() as session: try: session.feed_run(1 / 0) except MontyError as e: inner e.exception() # 还原为原生 ZeroDivisionError print(inner) # division by zero print(type(inner).__name__) # ZeroDivisionErrorexception()方法会根据存储的类型和消息重建一个真实的 Python 异常对象所以你可以直接用isinstance判断具体错误。例如沙箱里的json.loads失败会还原成带lineno、colno字段的json.JSONDecodeErrorcafé.encode(ascii)则还原出带encoding、object、start、end结构化字段的UnicodeEncodeError。这些用例全部可以在 crates/monty-python/tests/test_exceptions.py 中查阅。Traceback 解析traceback() 返回的 Frame 结构MontyRuntimeError和MontySyntaxError都提供traceback()方法返回一个Frame对象列表。每个 Frame 包含以下属性filename代码所在文件如main.pyline/column起始行、列从 1 开始end_line/end_column结束位置function_name函数名模块级代码为Nonesource_line可用于预览的源代码行except MontyRuntimeError as e: for frame in e.traceback(): print(frame.filename, frame.line, frame.function_name, frame.source_line)两个设计细节值得一提惰性构建帧列表在第一次调用traceback()时才生成并缓存。深递归异常不会让宿主进程白白分配大量内存。去重优化递归场景中多个帧指向同一行源码时只分配一份字符串对象。display() 方法3 种格式化输出的选型不想自己拼接display(format)直接返回格式化好的字符串支持三种模式实现见 crates/monty-types/src/exceptions.rs格式参数输出内容适用场景traceback默认完整的 CPython 风格 Traceback 异常行日志记录、调试面板type-msgZeroDivisionError: division by zero一行摘要用户提示、告警消息msg仅消息体division by zero嵌入已有错误模板except MontyRuntimeError as e: print(e.display()) # 完整 Traceback print(e.display(type-msg)) # ZeroDivisionError: division by zero print(e.display(msg)) # division by zero传入其他参数会抛出ValueError错误信息会明确告知三种合法取值。MontyTypingError的display()则不带参数直接返回按会话配置如full/concise渲染好的类型检查诊断文本。沙箱专属错误MontyCrashedError 与 MontyShutdownMonty 把执行放在子进程中崩溃只损失 Worker宿主进程毫发无伤——而这两类错误正是这种隔离的回执MontyCrashedErrorWorker 段错误、被外部杀死、触达request_timeout看门狗时限或自行宣告致命错误后退出。用e.timed_out区分是否超时e.exit_status查看退出码信号死亡时为None。捕获它换一个新会话重试即可。MontyShutdown仅出现在 WebSocket 远程场景表示服务器正在优雅关闭。它是唯一不带Error后缀的异常——因为这不是你代码的错。e.dump携带关闭前抓取的会话快照可交给新会话的load_session无缝续跑。新手常见问题FAQQ如何用一个except接住所有 Monty 错误捕获基类MontyError即可语法、运行时、类型检查、崩溃类错误全部覆盖。Q语法错误和运行时错误有什么本质区别MontySyntaxError发生在代码解析阶段feed_run时即抛出MontyRuntimeError发生在执行阶段两者都提供traceback()和display()。Q错误发生后会话还能用吗MontyRuntimeError/MontySyntaxError/MontyTypingError不会破坏会话可继续feed_run而MontyCrashedError会丢失整个会话需要重新 checkout。Q沙箱内部能自定义异常类吗不能。沙箱中的类无法继承raise MyClass()会触发TypeError: exceptions must derive from BaseException与 CPython 行为一致。总结你的需求该用什么接住一切沙箱错误except MontyError判断具体错误类型e.exception()isinstance拿到逐帧调用栈e.traceback()→Frame列表生成用户友好的错误文本e.display(type-msg)Worker 崩溃后恢复捕获MontyCrashedError并重试服务器关闭后续跑会话用MontyShutdown.dump恢复掌握这套5 大异常 exception()traceback()display()的组合拳你就能在任何 AI Agent 或代码执行服务中把 Monty 沙箱的错误处理做得既安全又专业。【免费下载链接】montyA minimal, secure Python interpreter written in Rust for use by AI项目地址: https://gitcode.com/GitHub_Trending/monty3/monty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表