You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Try/Catch捕获异常后代码无法恢复执行的问题咨询

问题根源:一次性递归遍历的局限性

你遇到的问题很典型——Directory.GetFiles的SearchOption.AllDirectories是一次性尝试递归遍历所有子目录,一旦遇到权限不足的目录,整个方法会立刻抛出异常并终止执行。你的catch块只能捕获这个单次异常,但原方法已经停止工作了,自然没法继续获取剩下的文件。

简单来说:你以为捕获异常后,GetFiles会自动跳过出错的目录继续遍历,但实际上这个方法根本没设计这个功能——它要么成功返回所有文件,要么中途抛出异常终止,没有“部分成功”的选项。

解决方案:拆分遍历逻辑,逐个处理目录

要实现“遇到异常跳过,继续执行”的效果,你需要把递归遍历拆成逐个目录处理的小操作,每个操作单独用try-catch包裹,这样某个目录出错不会影响其他目录的遍历。

这里给你一个VB.NET的实现示例:

' 递归遍历目录,跳过无权限的目录
Private Sub SearchWavFiles(ByVal targetDir As String)
    ' 第一步:处理当前目录下的.wav文件
    Try
        Dim currentFiles As String() = Directory.GetFiles(targetDir, "*.wav")
        ' 这里可以把找到的文件添加到你的结果集合里
        For Each filePath In currentFiles
            ' 示例:打印文件路径,你可以替换成自己的逻辑
            Console.WriteLine(filePath)
        Next
    Catch ex As UnauthorizedAccessException
        MessageBox.Show($"无权限访问目录:{targetDir}")
    End Try

    ' 第二步:遍历当前目录的所有子目录,递归调用自身
    Try
        Dim subDirectories As String() = Directory.GetDirectories(targetDir)
        For Each subDir In subDirectories
            ' 递归处理子目录
            SearchWavFiles(subDir)
        Next
    Catch ex As UnauthorizedAccessException
        MessageBox.Show($"无权限访问子目录:{targetDir}")
    End Try
End Sub

' 调用这个方法开始遍历
SearchWavFiles("C:\")
代码逻辑说明
  1. 拆分操作:把“遍历所有目录”拆成“处理当前目录文件”+“处理每个子目录”两个独立步骤,每个步骤单独捕获异常。
  2. 递归遍历:通过递归调用,逐个处理每个子目录,哪怕某个子目录无权限,只会跳过该目录的处理,不会影响其他子目录的遍历。
  3. 异常隔离:每个try-catch只负责当前小操作的异常,确保整个遍历流程不会因为单个目录的错误而中断。

这样修改后,你就能实现“捕获异常后继续执行”的需求了——遇到权限不足的目录时,程序会弹出提示,然后继续处理其他可访问的目录。

内容的提问来源于stack exchange,提问作者Neil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:48:41