.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:\")
代码逻辑说明
- 拆分操作:把“遍历所有目录”拆成“处理当前目录文件”+“处理每个子目录”两个独立步骤,每个步骤单独捕获异常。
- 递归遍历:通过递归调用,逐个处理每个子目录,哪怕某个子目录无权限,只会跳过该目录的处理,不会影响其他子目录的遍历。
- 异常隔离:每个try-catch只负责当前小操作的异常,确保整个遍历流程不会因为单个目录的错误而中断。
这样修改后,你就能实现“捕获异常后继续执行”的需求了——遇到权限不足的目录时,程序会弹出提示,然后继续处理其他可访问的目录。
内容的提问来源于stack exchange,提问作者Neil
相关产品推荐
相关产品推荐

