我有一个静态类,可以在其构造函数中从app.config中检索值。这些可能是null,如果是这种情况,我想抛出异常。
我想在使用这些值的静态方法中抛出错误,但ArgumentNullException
似乎不正确,因为它们不是传递给方法的参数。
有替代方案,还是这不是一个好方法?
答案 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)。如果采用通用方法,请务必在消息,数据等中添加详细信息。