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

含重复代码的双Catch分支Try-Catch块优化方案咨询

避免Try-Catch分支代码重复的简洁方案

你这个场景其实很常见——既要保留不同异常的差异化处理(创建目录vs直接初始化),又不想重复写相同的XML初始化逻辑。除了布尔变量,这里有几个更优雅的方案:

方案1:使用局部函数封装重复逻辑

C# 7.0及以上支持局部函数,刚好适合把这段重复的XML初始化代码封装在当前方法内部,既不污染外部命名空间,又能复用逻辑:

XmlDocument document = new XmlDocument();
// 定义局部函数,封装重复的XML初始化逻辑
void SetupDefaultXml()
{
    document.LoadXml(@"<?xml version=""1.0""?>
<elements>
</elements>");
}

try
{
    document.Load(Path.Combine(folderPath, "XMLfile.xml")); // 建议用Path.Combine替代字符串拼接
}
catch (System.IO.DirectoryNotFoundException)
{
    System.IO.Directory.CreateDirectory(folderPath);
    SetupDefaultXml(); // 复用初始化逻辑
}
catch (System.IO.FileNotFoundException)
{
    SetupDefaultXml(); // 直接复用
}

这个方案的好处是:

  • 重复代码只写一次,后续修改XML结构只需改一处
  • 局部函数仅在当前方法内可见,不会造成冗余
  • 保留了你想要的两个异常分支,逻辑清晰

方案2:提取重复的XML模板为常量+复用LoadXml调用

如果觉得局部函数有点重,也可以把固定的XML模板提取成一个字符串常量,然后在两个catch分支里复用LoadXml调用:

XmlDocument document = new XmlDocument();
const string DefaultXmlTemplate = @"<?xml version=""1.0""?>
<elements>
</elements>";

try
{
    document.Load(Path.Combine(folderPath, "XMLfile.xml"));
}
catch (System.IO.DirectoryNotFoundException)
{
    System.IO.Directory.CreateDirectory(folderPath);
    document.LoadXml(DefaultXmlTemplate);
}
catch (System.IO.FileNotFoundException)
{
    document.LoadXml(DefaultXmlTemplate);
}

这个方案更轻量化,适合逻辑简单的场景,缺点是如果后续初始化逻辑变复杂(比如要加更多动态内容),不如局部函数灵活。

另外提个小建议:尽量用Path.Combine替代字符串拼接路径,它会自动处理不同系统的路径分隔符,避免潜在的路径错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:58:12