.NET 異常處理的“暗門“:代碼裏寫滿 catch,你依然能抓住它——從一個 AI Agent 運行時的源碼說起
《.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)
暫無評論,來搶第一條。