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

C#中异常未被捕获排查:无法捕获UnauthorizedAccessException

为什么你的try-catch无法正常工作?

让我仔细拆解你的代码问题,核心原因主要有这几点:

1. 仅捕获UnauthorizedAccessException,遗漏了其他关键异常

Directory.GetFiles()和Directory.GetDirectories()除了权限不足的异常外,还可能抛出多种其他类型的错误:比如目录被临时删除导致的DirectoryNotFoundException、路径长度超过系统限制的PathTooLongException,甚至是文件系统临时故障引发的IOException。这些异常不在你的catch范围内,一旦触发就会直接终止程序,让你误以为是权限异常没被捕获。

2. 重复调用Directory.GetFiles(dir)造成冗余与潜在风险

你先执行了var files = Directory.GetFiles(dir);但完全没使用这个变量,紧接着又在foreach循环里重新调用了一次Directory.GetFiles(dir)。这不仅浪费IO资源,还可能因为两次调用之间目录内容发生变化(比如文件被删除),额外触发不必要的异常。

修正后的代码示例

这里是调整后的代码,解决了上述问题,同时增强了异常处理的覆盖范围:

var pathsToSearch = new Queue<string>();
var foundFiles = new List<string>();
pathsToSearch.Enqueue(startFolder);

while (pathsToSearch.Count > 0)
{
    var dir = pathsToSearch.Dequeue();
    try
    {
        // 只调用一次GetFiles,复用结果减少IO开销
        var files = Directory.GetFiles(dir);
        foreach (var file in files)
        {
            foundFiles.Add(file);
        }

        // 获取子目录并加入遍历队列
        var subDirs = Directory.GetDirectories(dir);
        foreach (var subDir in subDirs)
        {
            pathsToSearch.Enqueue(subDir);
        }
    }
    catch (UnauthorizedAccessException e)
    {
        Console.WriteLine($"无法访问目录 {dir}:权限不足 - {e.Message}");
    }
    catch (DirectoryNotFoundException e)
    {
        Console.WriteLine($"目录 {dir} 已不存在 - {e.Message}");
    }
    catch (PathTooLongException e)
    {
        Console.WriteLine($"目录 {dir} 路径过长 - {e.Message}");
    }
    catch (Exception e)
    {
        Console.WriteLine($"处理目录 {dir} 时发生未知错误:{e.Message}");
    }
}

额外优化提示

如果需要处理超大目录,建议改用Directory.EnumerateFiles()和Directory.EnumerateDirectories()——它们采用延迟加载机制,不会一次性把所有文件/目录加载到内存,性能更优,且异常触发时机更提前,便于精准处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:49:34