C #: исключение, чтобы бросить, когда ожидался определенный тип - PullRequest
2 голосов
/ 01 апреля 2010

Я знаю, что такого рода код не лучшая практика, но, тем не менее, в определенных ситуациях я считаю, что это более простое решение:

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 ]

3 голосов
/ 01 апреля 2010

Если 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) { }
}
0 голосов
/ 01 апреля 2010

По совпадению, сегодня я нашел очень хороший класс в блоге Джареда Парса, здесь , где он объясняет класс 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"));
0 голосов
/ 01 апреля 2010

Если obj является параметром для вашего метода, я бы бросил ArgumentException. Иначе, в этом случае, я бы, наверное, бросил свой.

См. это Q / A для краткого изложения на правилах исключения. По сути, есть некоторые встроенные исключения, которые считаются недопустимыми для выброса за рамки. ArgumentException один из них, который в порядке.

0 голосов
/ 01 апреля 2010

возможно System.InvalidOperationException (какую бы операцию ни выполнял ваш метод, нельзя выполнить с этим типом данных)? Или сделай свой, как другие предлагают

0 голосов
/ 01 апреля 2010

Смотрите здесь для полного списка исключений.К сожалению, я не думаю, что любой из них подходит вашей проблеме.Лучше создать свой собственный.

0 голосов
/ 01 апреля 2010

Вы можете использовать System.NotSupportedException или просто сделать свое собственное исключение на основе исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...