我正在使用ReSharper,在生成switch语句时遇到了两种情况:
public void DoWork(MyEnum value)
{
switch(value)
{
// ...
default:
throw new ArgumentOutOfRangeException("value");
}
}
public void DoWork()
{
var value = GetEnumValue();
switch(value)
{
// ...
default:
// Cannot resolve symbol 'value'
throw new ArgumentOutOfRangeException("value");
}
}
似乎如果我将枚举值作为参数传递,ReSharper并不会抱怨它生成的代码。它识别出value
在异常消息中被恰当地使用。
但是,如果我在方法中以其他方式获取值作为局部变量,ReSharper似乎会抱怨它生成的代码,声称"无法解析符号'值&#39 ;" 。这种情况很有意义,因为value
是一个局部变量,因此捕获异常消息的消费者不知道value
究竟是什么。
那么,为什么会这样呢?
答案 0 :(得分:5)
问题是您使用了错误类型的Exception
。在第二个示例中,value
不是参数,因此抛出ArgumentOutOfRangeException
在语义上是错误的。我在这种情况下创建了一个自定义Exception
,欢迎您将其用于您的目的:
public class UnexpectedEnumException : Exception
{
public UnexpectedEnumException(Type enumType, object unexpectedValue)
: base(string.Concat("Unexpected ", enumType.Name, ": ", unexpectedValue))
{
}
public static UnexpectedEnumException Create<TEnum>(TEnum unexpectedValue) where TEnum : struct, IConvertible, IFormattable, IComparable
{
return new UnexpectedEnumException(typeof (TEnum), unexpectedValue);
}
}
答案 1 :(得分:4)
According to MSDN paramName
应该是参数的值:
导致此异常的参数的名称。
所以你应该在那里使用参数的名称,而不是本地的。即使Resharper生成了它,它也无法进行这种更改,而不是在不做更改,例如更改异常类型。
在这种情况下,或许更好的例外是InvalidOperationException
。