.NET:缺少必需的配置设置时要引发哪个异常?

.NET:缺少必需的配置设置时要引发哪个异常?,.net,exception,configuration,.net,Exception,Configuration,下面是一个标准场景: if(string.IsNullOrEmpty(Configuration.AppSettings["foobar"])) throw new SomeStandardException("Application not configured correctly, bozo."); 问题是,我不能完全确定应该是哪个异常SomeStandardException 我仔细阅读了3.5框架,发现了两个可能的候选者:和 System.Configuration.Config

下面是一个标准场景:

if(string.IsNullOrEmpty(Configuration.AppSettings["foobar"]))
   throw new SomeStandardException("Application not configured correctly, bozo.");
问题是,我不能完全确定应该是哪个异常
SomeStandardException

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

System.Configuration.ConfigurationException 异常发生时引发的异常 配置系统错误已发生 发生了

评论
ConfigurationException
异常为 如果应用程序试图 读取或写入数据到 配置文件,但不可用 不成功的一些可能的原因 为此,可能会在中包含格式错误的XML 配置文件,文件 权限问题和配置 属性的值不是 有效

注意:

ConfigurationException
对象为 保持向后兼容性。
ConfigurationErrorsException
对象将其替换为 配置系统

这个异常听起来非常适合我的需要,但它已经被标记为过时,所以,在atthay上

这给我们带来了一个完全令人费解的问题:

System.Configuration.ConfigurationErrorsException 当前值不是 启用会话状态值

正如您所看到的,它的文档是完全无用的。(在本地和在线帮助中都是这样。)对该课程本身的检查表明,对于我想要的东西来说,这简直是大刀阔斧

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

你们用什么解决方案,如果有的话,来解决这个问题,我是否必须接受它,并为此推出我自己的例外

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


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

我会接受它并推出自己的。。。但在此之前,是否可以让系统假定此配置设置的默认值?我通常会尝试在每一个可能会被忽略的环境中这样做。。。(或者我应该说,对于尽可能多的设置-对于某些设置,让系统做出默认决定显然是不合适的…)

一般来说,自定义异常不需要花费很多精力。。。这里有一个例子

[Serializable]
public class MyCustomApplicationException : ApplicationException
{
    #region privates
    #endregion privates

    #region properties
    #endregion properties

    public MyCustomApplicationException (string sMessage,
        Exception innerException)
        : base(sMessage, innerException) { }
    public MyCustomApplicationException (string sMessage)
        : base(sMessage) { }
    public MyCustomApplicationException () { }

    #region Serializeable Code
    public MyCustomApplicationException (
       SerializationInfo info, StreamingContext context)
        : base(info, context) { }
    #endregion Serializeable Code
}

您可以尝试继承XML异常,或者直接使用它

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

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

[Serializable]
public class ConfigurationMissingException : ConfigurationErrorsException
{}
编辑:在这种情况下编写您自己的异常有一个额外的好处,即保证不会对异常来自何处(框架或您的应用程序)产生任何混淆。框架永远不会抛出自定义异常

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

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


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

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

我的一般规则是:

  • 如果缺少配置的情况不是很常见,并且我相信我永远不会希望以与其他异常不同的方式处理这种情况,那么我只需使用基本的“Exception”类,并提供适当的消息:

    抛出新异常(“我的消息在此”)

  • 如果我真的想,或者认为很有可能我会以一种与大多数其他例外情况不同的方式来处理这个案例,我会像人们在这里已经建议的那样使用我自己的类型


  • 我倾向于不同意你问题的前提:

    简而言之,我需要一个标准的异常
    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
            )
            );
    }