如果缺少配置值,我应该抛出什么异常
本文关键字:什么 异常 我应该 配置 如果 | 更新日期: 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)。 如果采用通用方法,请确保在消息、数据等中添加详细信息。