这是一个标准方案:
if(string.IsNullOrEmpty(Configuration.AppSettings["foobar"])) throw new SomeStandardException("Application not configured correctly, bozo.");
问题是,我不完全确定应该是哪个例外SomeStandardException
.
我仔细阅读了3.5框架,发现了两个可能的候选人:ConfigurationException
和ConfigurationErrorsException
.
System.Configuration.ConfigurationException
发生配置系统错误时引发的异常.
备注
该ConfigurationException
如果应用程序试图读取或写入数据到配置文件,但不成功则抛出异常.可能的原因可能包括配置文件中格式错误的XML,文件权限问题以及值无效的配置属性.注意:
ConfigurationException
维护该对象是为了向后兼容.该ConfigurationErrorsException
对象替换配置系统.
这个例外实际上听起来非常适合我所需要的,但它已被标记为过时,所以,ixnay on atthay.
这让我们彻底迷惑ConfigurationErrorsException
:
System.Configuration.ConfigurationErrorsException
当前值不是EnableSessionState值之一.
如您所见,其文档完全没用.(在本地和在线帮助中都是如此.)对课程本身的检查表明,对于我想要的东西来说,这是一种极端的过度杀伤力.
简而言之,我需要一个标准异常,当应用程序配置设置丢失或包含无效值时应抛出该异常.你认为框架有一个例外,它允许应用程序使用它.(它显然没有,但它被标记为已过时,并且被替换的东西多范围较大.)
你们有什么解决方案,如果有的话,我们将不得不将其吸收并为此推出自己的例外情况?
有些人问我是否可以提供默认值,然后继续.在某些情况下,是的,在这些情况下,不会抛出异常.但是,对于某些设置,这将不适用.例如:数据库服务器名称和凭据,身份验证服务器以及安装的第三方应用程序的路径.
还值得注意的是,我主要处理的应用程序是以批处理模式运行的控制台应用程序,我希望它抛出一个由main方法捕获的异常,并在没有正确配置的情况下正确记录.(这是我继承的遗留代码,目前只是假设一切都很好.)
就个人而言,我使用InvalidOperationException,因为它是对象状态的问题 - 而不是配置系统.毕竟,你不应该允许这些设置由代码设置而不是配置吗?这里重要的部分并不是app.config中没有行,而是没有必要的信息.
对我来说,ConfigurationException(以及它的替代,ConfigurationErrorsException - 尽管有误导性的MSDN文档)是出于配置的保存,读取等错误.
您不会将异常抛向框架中的现有异常.如果您决定使用现有的例外,则不必完全按照文档中的说明进行操作.该文档将描述框架如何使用给定的异常,但并不意味着对您选择使用/重用现有异常的方式有任何限制.
它是您的应用程序 - 只要您记录它并清楚地指出在缺少配置值的特定情况下将抛出的异常,您可以使用您喜欢的任何异常.如果您确实想要一个非常具体的缺失值指示,您可以考虑编写自己的ConfigurationSettingMissing异常:
[Serializable] public class ConfigurationMissingException : ConfigurationErrorsException {}
编辑:在这种情况下编写自己的异常带来额外的好处,保证永远不会有任何关于异常来自框架或您的应用程序的混淆.该框架永远不会抛出您的自定义异常.
更新:我同意这些注释,因此我已将子类更改为Exception中的ConfigurationErrorsException.我认为在可能的情况下从现有的Framework异常中继承自定义异常通常是一个好主意,避免使用Exception类,除非您需要特定于应用程序的异常.
正如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 ) ); }
那么System.Configuration.SettingsPropertyNotFoundException怎么样?
ConfigurationErrorsException是引入您描述的情况的正确异常.ConfigurationErrorsException的早期版本的MSDN文档更有意义.
http://msdn.microsoft.com/en-us/library/system.configuration.configurationerrorsexception(VS.80).aspx
早期的MSDN摘要和备注是:
发生配置系统错误时引发的异常.
在读取或写入配置信息时发生任何错误时,将引发ConfigurationErrorsException异常.
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)); }