含重复代码的双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
相关产品推荐
相关产品推荐

