当前位置:  开发笔记 > 运维 > 正文

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

如何解决《.NET:缺少必需的配置设置时抛出哪个异常?》经验,为你挑选了6个好方法。

这是一个标准方案:

if(string.IsNullOrEmpty(Configuration.AppSettings["foobar"]))
   throw new SomeStandardException("Application not configured correctly, bozo.");

问题是,我不完全确定应该是哪个例外SomeStandardException.

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

System.Configuration.ConfigurationException

发生配置系统错误时引发的异常.

备注

ConfigurationException如果应用程序试图读取或写入数据到配置文件,但不成功则抛出异常.可能的原因可能包括配置文件中格式错误的XML,文件权限问题以及值无效的配置属性.

注意:

ConfigurationException维护该对象是为了向后兼容.该ConfigurationErrorsException 对象替换配置系统.

这个例外实际上听起来非常适合我所需要的,但它已被标记为过时,所以,ixnay on atthay.

这让我们彻底迷惑ConfigurationErrorsException:

System.Configuration.ConfigurationErrorsException

当前值不是EnableSessionState值之一.

如您所见,其文档完全没用.(在本地和在线帮助中都是如此.)对课程本身的检查表明,对于我想要的东西来说,这是一种极端的过度杀伤力.

简而言之,我需要一个标准异常,当应用程序配置设置丢失或包含无效值时应抛出该异常.你认为框架有一个例外,它允许应用程序使用它.(它显然没有,但它被标记为已过时,并且被替换的东西范围较大.)

你们有什么解决方案,如果有的话,我们将不得不将其吸收并为此推出自己的例外情况?

编辑补遗

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

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



1> Mark Bracket..:

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

对我来说,ConfigurationException(以及它的替代,ConfigurationErrorsException - 尽管有误导性的MSDN文档)是出于配置的保存,读取等错误.



2> Dave Swersky..:

您不会将异常抛向框架中的现有异常.如果您决定使用现有的例外,则不必完全按照文档中的说明进行操作.该文档将描述框架如何使用给定的异常,但并不意味着对选择使用/重用现有异常的方式有任何限制.

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

[Serializable]
public class ConfigurationMissingException : ConfigurationErrorsException
{}

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

更新:我同意这些注释,因此我已将子类更改为Exception中的ConfigurationErrorsException.我认为在可能的情况下从现有的Framework异常中继承自定义异常通常是一个好主意,避免使用Exception类,除非您需要特定于应用程序的异常.


我有点不同意.如果您要使用现有的例外,它应该在文档说明使用它时完全使用,否则您会混淆那些追随您的人.如果你要做一些不同的事情,就像你说的那样创建自己的例外.

3> Joe..:

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

在.NET 2.0之前,建议使用System.Configuration.ConfigurationException.ConfigurationException在.NET 2.0中已经过时,原因从来都不清楚,并且建议更改为使用ConfigurationErrorsException.

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

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
        )
        );
}



4> 小智..:

那么System.Configuration.SettingsPropertyNotFoundException怎么样?



5> Daniel Richa..:

ConfigurationErrorsException是引入您描述的情况的正确异常.ConfigurationErrorsException的早期版本的MSDN文档更有意义.

http://msdn.microsoft.com/en-us/library/system.configuration.configurationerrorsexception(VS.80).aspx

早期的MSDN摘要和备注是:

发生配置系统错误时引发的异常.

在读取或写入配置信息时发生任何错误时,将引发ConfigurationErrorsException异常.


来自文档:"此API支持产品基础结构,不能直接在您的代码中使用.初始化ConfigurationErrorsException类的新实例."

6> Gaspar Nagy..:

ConfigurationElement类(它是许多与配置相关的类的基类,如ConfigurationSection)有一个名为OnRequiredPropertyNotFound的方法(还有其他辅助方法).你可以打电话给那些.

OnRequiredPropertyNotFound实现如下:

protected virtual object OnRequiredPropertyNotFound(string name) {
    throw new ConfigurationErrorsException(SR.GetString("Config_base_required_attribute_missing", new object[] { name }), this.PropertyFileName(name), this.PropertyLineNumber(name)); }

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有