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

本文关键字:什么 异常 我应该 配置 如果 | 更新日期: 2023-09-27 18:31:14

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

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

有没有其他选择,或者这不是一个好方法?

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

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

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

您可以创建自己的自定义例外 (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: 不要引发保留的异常类型:

不要引发常规异常

如果引发常规异常类型,例如异常或 SystemException 在库或框架中,它迫使消费者 捕获所有异常,包括它们没有的未知异常 知道如何处理。

相反,要么抛出一个更派生的类型,该类型已经存在于 框架,或创建派生自异常的自己的类型。

如何解决违规问题

若要解决与此规则的冲突,请将引发的异常的类型更改为不属于保留类型的特定类型。

何时禁止显示警告

不要禁止显示来自此规则的警告。

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

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

您可以使用任何 System.Configuration 命名空间异常。或者创建自己的 ConfigurationParameterNullException

创建一个继承自 Exception 的类:

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

public class NullConfigEntryException: Exception

然后在找到一个空的时抛出一个 NullConfigEntryException

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