如果缺少配置值,我应该抛出什么异常?

时间:2016-01-20 16:08:26

标签: c# exception-handling

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

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

有替代方案,还是这不是一个好方法?

5 个答案:

答案 0 :(得分:5)

你扔什么都没关系。它不应该被捕获,捕获它不会修复.config文件。使用自定义异常类型只会鼓励不良做法。

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

答案 1 :(得分:0)

您可以使用任何System.Configuration namespace例外。或者创建自己的ConfigurationParameterNullException

答案 2 :(得分:0)

创建一个继承自Exception的类:

https://msdn.microsoft.com/en-us/library/87cdya3t(v=vs.110).aspx

public class NullConfigEntryException: Exception

然后在找到空的

时抛出NullConfigEntryException

答案 3 :(得分:0)

您可以创建自己的自定义例外(MSDN)。

基本上:

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

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

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

为什么呢?如果您遵循Microsoft代码分析规则,则不能简单地throw new Exception();,因为这会违反CA2201: Do not raise reserved exception types

  

不要引发常规异常

     

如果抛出一般异常类型,例如Exception或   它在库或框架中的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)
    {
    }
}

答案 4 :(得分:0)

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