首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >.NET:当缺少必需的配置设置时抛出哪个异常?

.NET:当缺少必需的配置设置时抛出哪个异常?
EN

Stack Overflow用户
提问于 2009-01-06 16:23:17
回答 11查看 47.4K关注 0票数 137

下面是一个标准场景:

代码语言:javascript
复制
if(string.IsNullOrEmpty(Configuration.AppSettings["foobar"]))
   throw new SomeStandardException("Application not configured correctly, bozo.");

问题是,我不能完全确定SomeStandardException应该是哪个异常。

我仔细阅读了3.5框架,发现了两个可能的候选者:ConfigurationExceptionConfigurationErrorsException

System.Configuration.ConfigurationException

当配置系统错误具有occurred.Remarks时引发的异常

如果应用程序尝试从配置文件读取数据或将数据写入配置文件但失败,则会引发ConfigurationException异常。一些可能的原因可能包括配置文件中存在格式错误的XML、文件权限问题以及值无效的配置属性。

备注:

保留ConfigurationException对象是为了向后兼容。ConfigurationErrorsException对象将其替换为配置系统。

这个例外实际上听起来非常符合我的需要,但是它已经被标记为过时了,所以,我还是不要了。

这就把我们带到了令人费解的ConfigurationErrorsException

System.Configuration.ConfigurationErrorsException

当前值不是EnableSessionState值之一。

如您所见,它的文档是完全无用的。(在本地帮助和联机帮助中都是这样。)对这个类本身的检查表明,它对于我想要的东西来说过于夸张了。

简而言之,我需要一个标准异常,当应用程序配置设置丢失或包含无效值时,应该抛出该异常。您可能会认为框架中包含了这样一个异常,以供应用程序使用。(它显然是这样做的,但它被标记为过时,并被范围更大的东西所取代。)

你们在使用什么解决方案,如果有的话,我是不是必须接受它,并为此而使用我自己的异常?

编辑附录

有些人问我是否可以提供一个默认值,然后继续。在某些情况下,是的,在这些情况下,异常不会被抛出。但是,对于某些设置,这将不适用。例如:数据库服务器名称和凭证、身份验证服务器以及安装的第三方应用程序的路径。

还值得注意的是,我主要处理的应用程序是一个在批处理模式下运行的控制台应用程序,我希望它抛出一个异常,该异常由main方法捕获并在没有正确配置的情况下进行适当的记录。(这是我继承的遗留代码,目前只是假设一切正常。)

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-01-06 16:29:16

您的异常抛出并不局限于框架中现有的异常。如果您确实决定使用现有的异常,则不必完全遵循文档。文档将描述框架如何使用给定的异常,但并不意味着对您选择如何使用/重用现有异常有任何限制。

这是您的应用程序-只要您记录它并清楚地指出在缺少配置值的特定情况下将抛出的异常,您就可以使用任何您喜欢的异常。如果您确实想要一个非常具体的缺失值指示,您可以考虑编写您自己的ConfigurationSettingMissing异常:

代码语言:javascript
复制
[Serializable]
public class ConfigurationMissingException : ConfigurationErrorsException
{}

编辑:在这种情况下编写你自己的异常会带来额外的好处,保证永远不会有任何关于异常来自哪里的混淆-框架,还是你的应用程序。框架永远不会抛出您的自定义异常。

更新:我同意评论,所以我已经将子类从Exception改为ConfigurationErrorsException。我认为,在可能的情况下,从现有框架异常中子类化自定义异常通常是一个好主意,避免使用exception类,除非您需要特定于应用程序的异常。

票数 41
EN

Stack Overflow用户

发布于 2009-01-06 16:32:38

就我个人而言,我会使用InvalidOperationException,因为它是对象状态的问题,而不是配置系统的问题。毕竟,您不应该允许这些设置由代码设置,而不是由配置设置吗?这里重要的部分不是app.config中没有行,而是所需的信息不存在。

对我来说,ConfigurationException (以及它的替代品,ConfigurationErrorsException --尽管有误导性的MSDN文档)是针对配置的保存、读取等方面的错误。

票数 52
EN

Stack Overflow用户

发布于 2009-01-06 17:23:51

正如Daniel Richardson所说,ConfigurationErrorsException是可以使用的。通常,只有当您有处理它们的场景时,才建议创建您自己的自定义异常类型。在配置错误的情况下,这通常是致命的,这种情况很少发生,因此重用现有的ConfigurationErrorsException类型通常更合适。

在.NET 2.0之前,推荐使用System.Configuration.ConfigurationException.由于我从来不清楚的原因,ConfigurationException在.NET 2.0中变得过时了,并且推荐改用ConfigurationErrorsException。

我使用帮助器方法来抛出异常,以便在从.NET 1.x迁移到2.0时,或者如果微软决定再次更改建议时,可以很容易地更改在一个地方抛出的异常:

代码语言:javascript
复制
if(string.IsNullOrEmpty(Configuration.AppSettings("foobar")))
{
   throw CreateMissingSettingException("foobar");
}

...

private static Exception CreateMissingSettingException(string name)
{
    return new ConfigurationErrorsException(
        String.Format
        (
        CultureInfo.CurrentCulture,
        Properties.Resources.MissingConfigSetting,
        name
        )
        );
}
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/417187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档