阅界资讯

.NET 异常处理的“暗门“:代码里写满 catch,你依然能抓住它——从一个 AI Agent 运行时的源码说起

阅阅界编辑部2阅读7分钟

《.NET 异常处理的“暗门“:代码里写满 catch,你依然能抓住它——从一个 AI Agent 运行时的源码说起》是近期博客园技术区的好帖,信息密度大。下面分段讲清它的核心内容,看到结尾你就知道该怎么做了。

你的系统里是不是也有这样的代码? [代码示例略] 异常被吞掉了,日志里没有,监控看不到,问题却真实存在。今天介绍一个 .NET 的"隐藏技能",让你 无论异常是否被 catch,都能在第一时间感知到 。 为了不说空话,这次我们直接打开一个真实的开源项目—— OpenClaw.NET (一个 NativeAOT 友好的 .NET AI Agent 运行时与网关,GitHub 搜 clawdotnet/openclaw.net ),看看它的源码里藏着多少"被优雅吞掉"的异常,以及我们如何用 FirstChanceException 把它们全部揪出来。 〇、先看源码:Agent 运行时里,异常都去哪了? 跑过 AI Agent 的朋友可能有这种体验:Agent 突然"变笨了"——工具调用失败它不说,记忆检索挂了她也不提,只是回答质量肉眼可见地下降。 这不是玄学。

你的系统里是不是也有这样的代码? [代码示例略] 异常被吞掉了,日志里没有,监控看不到,问题却真实存在。今天介绍一个 .NET 的"隐藏技能",让你 无论异常是否被 catch,都能在第一时间感知到 。 为了不说空话,这次我们直接打开一个真实的开源项目—— OpenClaw.NET (一个 NativeAOT 友好的 .NET AI Agent 运行时与网关,GitHub 搜 clawdotnet/openclaw.net ),看看它的源码里藏着多少"被优雅吞掉"的异常,以及我们如何用 FirstChanceException 把它们全部揪出来。 〇、先看源码:Agent 运行时里,异常都去哪了? 跑过 AI Agent 的朋友可能有这种体验:Agent 突然"变笨了"——工具调用失败它不说,记忆检索挂了她也不提,只是回答质量肉眼可见地下降。 这不是玄学。打开 OpenClaw.NET 的源码,你会发现这是一个 刻意设计 的结果:Agent 运行时为了保证对话不中断,会在各个层面把异常"降级"掉。

你的系统里是不是也有这样的代码? [代码示例略] 异常被吞掉了,日志里没有,监控看不到,问题却真实存在。今天介绍一个 .NET 的"隐藏技能",让你 无论异常是否被 catch,都能在第一时间感知到 。 为了不说空话,这次我们直接打开一个真实的开源项目—— OpenClaw.NET (一个 NativeAOT 友好的 .NET AI Agent 运行时与网关,GitHub 搜 clawdotnet/openclaw.net ),看看它的源码里藏着多少"被优雅吞掉"的异常,以及我们如何用 FirstChanceException 把它们全部揪出来。 〇、先看源码:Agent 运行时里,异常都去哪了? 跑过 AI Agent 的朋友可能有这种体验:Agent 突然"变笨了"——工具调用失败它不说,记忆检索挂了她也不提,只是回答质量肉眼可见地下降。 这不是玄学。打开 OpenClaw.NET 的源码,你会发现这是一个 刻意设计 的结果:Agent 运行时为了保证对话不中断,会在各个层面把异常"降级"掉。 形态一:工具执行失败 → 变成一句字符串 src/OpenClaw.Agent/OpenClawToolExecutor.cs 中,工具执行用一个 catch-all 兜底: [代码示例略] 异常对象在这里被"翻译"成 Error: Tool execution failed. 喂回给大模型。

你的系统里是不是也有这样的代码? [代码示例略] 异常被吞掉了,日志里没有,监控看不到,问题却真实存在。今天介绍一个 .NET 的"隐藏技能",让你 无论异常是否被 catch,都能在第一时间感知到 。 为了不说空话,这次我们直接打开一个真实的开源项目—— OpenClaw.NET (一个 NativeAOT 友好的 .NET AI Agent 运行时与网关,GitHub 搜 clawdotnet/openclaw.net ),看看它的源码里藏着多少"被优雅吞掉"的异常,以及我们如何用 FirstChanceException 把它们全部揪出来。 〇、先看源码:Agent 运行时里,异常都去哪了? 跑过 AI Agent 的朋友可能有这种体验:Agent 突然"变笨了"——工具调用失败它不说,记忆检索挂了她也不提,只是回答质量肉眼可见地下降。 这不是玄学。打开 OpenClaw.NET 的源码,你会发现这是一个 刻意设计 的结果:Agent 运行时为了保证对话不中断,会在各个层面把异常"降级"掉。 形态一:工具执行失败 → 变成一句字符串 src/OpenClaw.Agent/OpenClawToolExecutor.cs 中,工具执行用一个 catch-all 兜底: [代码示例略] 异常对象在这里被"翻译"成 Error: Tool execution failed. 喂回给大模型。对话不会断,但 真实的堆栈只有日志里才有 ——如果日志级别没配对,它就消失了。

你的系统里是不是也有这样的代码? [代码示例略] 异常被吞掉了,日志里没有,监控看不到,问题却真实存在。今天介绍一个 .NET 的"隐藏技能",让你 无论异常是否被 catch,都能在第一时间感知到 。 为了不说空话,这次我们直接打开一个真实的开源项目—— OpenClaw.NET (一个 NativeAOT 友好的 .NET AI Agent 运行时与网关,GitHub 搜 clawdotnet/openclaw.net ),看看它的源码里藏着多少"被优雅吞掉"的异常,以及我们如何用 FirstChanceException 把它们全部揪出来。 〇、先看源码:Agent 运行时里,异常都去哪了? 跑过 AI Agent 的朋友可能有这种体验:Agent 突然"变笨了"——工具调用失败它不说,记忆检索挂了她也不提,只是回答质量肉眼可见地下降。 这不是玄学。打开 OpenClaw.NET 的源码,你会发现这是一个 刻意设计 的结果:Agent 运行时为了保证对话不中断,会在各个层面把异常"降级"掉。 形态一:工具执行失败 → 变成一句字符串 src/OpenClaw.Agent/OpenClawToolExecutor.cs 中,工具执行用一个 catch-all 兜底: [代码示例略] 异常对象在这里被"翻译"成 Error: Tool execution failed. 喂回给大模型。对话不会断,但 真实的堆栈只有日志里才有 ——如果日志级别没配对,它就消失了。 形态二:MCP 工具失败 → 同样变成字符串 src/OpenClaw.Agent/Tools/McpNativeTool.cs : [代码示例略] 形态三:记忆召回失败 → 打个 Warning 继续跑 src/OpenClaw.Agent/AgentRuntime.cs 里大量这样的代码: [代码示例略] 记忆召回失败,Agent 只是"失去记忆"继续回答。

建议先收藏再实操:挑其中一个点今天就试试,跑通了再看下一个。知识只有过手才是你的,你准备先试哪一点? 来源|博客园《.NET 异常处理的“暗门“:代码里写满 catch,你依然能抓住它——从一个 AI Agent 运行时的源码说起》,https://www.cnblogs.com/shanyou/p/22814535.html

程序员技术场技术后端

评论(0)

暂无评论,来抢第一条。