C# 如果缺少配置值,我应该引发什么异常?

C# 如果缺少配置值,我应该引发什么异常?,c#,exception-handling,C#,Exception Handling,我有一个静态类,它在其构造函数中从app.config检索值。这些可能是空的,如果是这种情况,我想抛出一个异常 我想在使用这些值的静态方法中抛出错误,但是ArgumentNullException似乎不正确,因为它们不是传递给方法的参数 是否有替代方法,或者这不是一个好方法?您可以使用任何异常。或者创建自己的配置参数UllException创建从Exception继承的类: 然后在找到空异常时抛出NullConfigEntryException您可以创建自己的自定义异常(MSDN) 基本上:

我有一个静态类,它在其构造函数中从app.config检索值。这些可能是空的,如果是这种情况,我想抛出一个异常

我想在使用这些值的静态方法中抛出错误,但是
ArgumentNullException
似乎不正确,因为它们不是传递给方法的参数


是否有替代方法,或者这不是一个好方法?

您可以使用任何异常。或者创建自己的配置参数UllException

创建从Exception继承的类:


然后在找到空异常时抛出NullConfigEntryException

您可以创建自己的自定义异常(MSDN)

基本上:

public class ConfigurationValueMissingException : Exception
{
    public ConfigurationValueMissingException()
    {
    }

    public ConfigurationValueMissingException(string message)
        : base(message)
    {
    }

    public ConfigurationValueMissingException(string message, Exception inner)
        : base(message, inner)
    {
    }
}
为什么??如果您遵循Microsoft代码分析规则,则不能简单地抛出新异常()因为这将违反:

不要抛出一般异常

如果抛出常规异常类型,例如异常或 SystemException在库或框架中,它强制使用者 捕获所有异常,包括未捕获的未知异常 知道如何处理

相反,可以抛出已存在于 框架,或者创建您自己的从Exception派生的类型

如何纠正违规行为

若要修复违反此规则的情况,请将引发异常的类型更改为不是保留类型之一的特定类型

何时抑制警告

不要抑制来自此规则的警告

这将是完全通过代码分析规则的自定义异常:

using System;
using System.Runtime.Serialization;

[Serializable]
public class ConfigurationValueMissingException : Exception
{
    public ConfigurationValueMissingException()
    {
    }

    public ConfigurationValueMissingException(string message)
        : base(message)
    {
    }

    public ConfigurationValueMissingException(string message, Exception inner)
        : base(message, inner)
    {
    }

    protected ConfigurationValueMissingException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }
}

你扔什么并不重要。它不是一个应该捕获的异常,捕获它不会修复.config文件。使用自定义异常类型只会鼓励错误的做法


所以不要抛出异常。一定要告诉读者.config文件有什么问题,这是他唯一需要知道的。他可以读取它,为AppDomain.CurrentDomain.UnhandledException编写事件处理程序

自定义异常信息量最大,您可以控制它包含的信息。一种更通用的方法是使用ApplicationException(最通用的是Exception)。如果您采用通用方法,请确保在消息、数据等中添加详细信息。

您可以创建自己的异常类型LordJam的答案似乎更适合您的具体情况在这种情况下不会有阅读器,因为它是按计划运行的控制台应用程序。我的想法是抛出它,在调用代码时捕获它并记录问题。是的,在未处理的异常事件处理程序中,记录总是一个很好的实践。当配置不正确时,试图继续工作,假装它没有发生,这是一种非常糟糕的做法。这个错误很容易纠正,无论如何都没有理由试图完成工作。
using System;
using System.Runtime.Serialization;

[Serializable]
public class ConfigurationValueMissingException : Exception
{
    public ConfigurationValueMissingException()
    {
    }

    public ConfigurationValueMissingException(string message)
        : base(message)
    {
    }

    public ConfigurationValueMissingException(string message, Exception inner)
        : base(message, inner)
    {
    }

    protected ConfigurationValueMissingException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }
}