我知道这种代码不是最佳实践,但在某些情况下我发现这是一个更简单的解决方案:
if (obj.Foo is Xxxx)
{
// Do something
}
else if (obj.Foo is Yyyy)
{
// Do something
}
else
{
throw new Exception("Type " + obj.Foo.GetType() + " is not handled.");
}
任何人都知道在这种情况下我是否可以抛出内置异常?
答案 0 :(得分:3)
如果obj
是方法的参数,则应抛出ArgumentException
:
throw new ArgumentException("Type " + obj.Foo.GetType() + " is not handled.", "obj");
否则,您应该抛出InvalidOperationException
或创建自己的异常,如下所示:
///<summary>The exception thrown because of ...</summary>
[Serializable]
public class MyException : Exception {
///<summary>Creates a MyException with the default message.</summary>
public MyException () : this("An error occurred") { }
///<summary>Creates a MyException with the given message.</summary>
public MyException (string message) : base(message) { }
///<summary>Creates a MyException with the given message and inner exception.</summary>
public MyException (string message, Exception inner) : base(message, inner) { }
///<summary>Deserializes a MyException .</summary>
protected MyException (SerializationInfo info, StreamingContext context) : base(info, context) { }
}
答案 1 :(得分:0)
您可以使用System.NotSupportedException
或根据例外情况制作自己的例外。
答案 2 :(得分:0)
查看here以查看完整的例外列表。不幸的是,我不认为它们适合你的问题。最好创建自己的。
答案 3 :(得分:0)
也许System.InvalidOperationException(无论你的方法要做什么操作都不能在这种数据类型上完成)?或者按照其他人的建议制作自己的
答案 4 :(得分:0)
如果obj是您方法的参数,我会抛出ArgumentException
。否则,在这种情况下,我可能会自己动手。
有关例外指南的详细信息,请参阅this Q/A。基本上,有一些内置的异常被认为是不受限制地抛出框架。 ArgumentException
就是其中一个没问题。
答案 5 :(得分:0)
巧合的是,今天我从Jared Pars的Weblog here找到了一个非常好的课程,在那里他解释了一个SwitchType类来处理这种情况。
用法:
TypeSwitch.Do(
sender,
TypeSwitch.Case<Button>(() => textBox1.Text = "Hit a Button"),
TypeSwitch.Case<CheckBox>(x => textBox1.Text = "Checkbox is " + x.Checked),
TypeSwitch.Default(() => textBox1.Text = "Not sure what is hovered over"));