C#:当预期某种类型时抛出异常

时间:2010-04-01 01:40:51

标签: c# exception

我知道这种代码不是最佳实践,但在某些情况下我发现这是一个更简单的解决方案:

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.");
}

任何人都知道在这种情况下我是否可以抛出内置异常?

6 个答案:

答案 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)

巧合的是,今天我从Jare​​d 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"));