gpt4 book ai didi

c# - 我应该捕获所有可能的特定异常还是仅捕获一般异常并将其包装在自定义异常中?

转载 作者:行者123 更新时间:2023-11-30 22:06:49 24 4
gpt4 key购买 nike

假设我想将一些 XML 文件反序列化为强类型对象。如果此 XML 文件无法反序列化(无论出于何种原因),我将创建一个默认对象并继续正常的应用程序工作流,而不向用户显示任何错误。 (实际上此应用程序作为 Windows 服务运行,因此没有用户...例如,假设应用程序尝试加载配置文件,如果失败则仅使用默认配置)。

我的问题是如何创建 Deserialize() 方法以便通过调用代码轻松使用?我主要关心的是如何处理异常……这是我的研究。

解决方案一:

这是最简单的方法:

    public static T Deserialize<T>(string xml)
{
var serializer = new XmlSerializer(typeof (T));
using (var sr = new StreamReader(xml))
using (var reader = XmlReader.Create(sr))
return (T) serializer.Deserialize(reader);
}

我认为在调用代码中使用此方法会非常困难,因为我必须处理所有可能由这些方法/构造函数抛出的异常。调用代码不关心这些,只关心操作是否成功。

这是我的第二次尝试:

解决方案 2:

    public static T Deserialize<T>(string xml)
{
try
{
var serializer = new XmlSerializer(typeof (T));
using (var sr = new StreamReader(xml))
using (var reader = XmlReader.Create(sr))
return (T) serializer.Deserialize(reader);
}
catch (ArgumentException ex)
{
throw new XmlDeserializeException(ValidationExceptionMsg, ex);
}
catch (IOException ex)
{
throw new XmlDeserializeException(ValidationExceptionMsg, ex);
}
catch (XmlSchemaException ex)
{
throw new XmlDeserializeException(ValidationExceptionMsg, ex);
}
catch (InvalidOperationException ex)
{
throw new XmlDeserializeException(ValidationExceptionMsg, ex);
}
}

在这里,我创建了一个名为 XmlDeserializeException 的自定义异常,并用它来包装 try block 中的方法(如 MSDN 中指定的)可以抛出的所有异常。现在,调用代码应该只捕获 XmlDeserializeException 就知道有错误。但是我不确定这个解决方案有多好...如果我需要创建很多这样的方法,那么它们都会有很多 catch block ,这些 block 只将异常包装到自定义异常中。

所以我想知道下面的代码会不会更好:

解决方案 3:

    public static T Deserialize<T>(string xml)
{
try
{
var serializer = new XmlSerializer(typeof (T));
using (var sr = new StreamReader(xml))
using (var reader = XmlReader.Create(sr))
return (T) serializer.Deserialize(reader);
}
catch (Exception ex)
{
throw new XmlDeserializeException(ValidationExceptionMsg, ex);
}
}

在这里,我捕获一般异常并将其包装在自定义 XmlDeserializeException 中。这样我减少了代码编写,没有代码冗余,也没有那么困惑。调用代码将再次只需要像解决方案 2 中那样捕获 XmlDeserializeException。

我应该使用哪种解决方案,为什么?有没有更好的办法?请记住我想使用 Deserialize() 方法的场景,这不是一个库/框架,而是一个没有用户交互性的应用程序。

最佳答案

如果您以相同的方式处理异常,那么使用不同的 catch 确实没有意义,在这种情况下,您可以尽量减少困惑并使用解决方案 3。

解决方案 2 只是更多的代码来完成完全相同的事情。

关于c# - 我应该捕获所有可能的特定异常还是仅捕获一般异常并将其包装在自定义异常中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23340119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com