为什么在递归函数C#中尝试捕获错误

Why does try catch error in recursive function C#

我创建了一个函数,用于用目标目录填充树视图。但是,当我尝试实施和错误检查以跳过可能具有文件夹权限限制的文件夹时,我收到错误消息。为什么会出现此错误以及如何修复它?

提前致谢。

using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace directoryBrowser
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            ListDirectory(treeView1, @"C:\Windows");
        }

        public void ListDirectory(TreeView treeView, string path)
        {
            treeView.Nodes.Clear();
            var rootDirectoryInfo = new DirectoryInfo(path);
            treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo));
        }

        public static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
        {
            //try
            //{
                var directoryNode = new TreeNode(directoryInfo.Name);

                foreach (var directory in directoryInfo.GetDirectories())
                {
                    directoryNode.Nodes.Add(CreateDirectoryNode(directory));
                }
                foreach (var file in directoryInfo.GetFiles())
                {
                    directoryNode.Nodes.Add(new TreeNode(file.Name));
                }
                return directoryNode;
            //}
            //catch (UnauthorizedAccessException) { }
        }
    }
}

你是在回答你自己的问题。你得到一个错误,因为这个函数 运行 下的用户帐户没有访问某些文件夹的权限。

然后您应该在 for 循环中应用一个 try/catch 语句,这样如果您遇到此异常,您的函数将继续 运行 用于以下文件夹。

public static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
    {
        var directoryNode = new TreeNode(directoryInfo.Name);

        foreach (var directory in directoryInfo.GetDirectories())
        {
             //try
            {
                directoryNode.Nodes.Add(CreateDirectoryNode(directory));
            } catch {
                // cannot access directory
            }
        }
        foreach (var file in directoryInfo.GetFiles())
            {
                directoryNode.Nodes.Add(new TreeNode(file.Name));
            }
            return directoryNode;
        }