Ссылка , предоставленная Джейсоном , довольно всеобъемлющая, но многие типы исключений в ней (такие как NullReferenceException
или IndexOutOfRangeException
) действительно только генерируются платформой;было бы не очень уместно, если бы вы были разработчиком, явно бросать их.
Вот, на мой взгляд, несколько наиболее полезных типов исключений для разработчика.
ArgumentNullException
Это очевидно: один из аргументов, передаваемых методу, был null
, но для этого конкретного метода значение null
для этого аргумента недопустимо.
ArgumentOutOfRangeException
Значение было предоставлено методу, который находится за пределами диапазона, который имеет смысл для этого метода.
Пример
В большинстве методов, которые принимают параметр, представляющий величину илидлина, только положительные значения имеют смысл для этого параметра.Так что проверка типа
if (x < 1)
{
throw new ArgumentOutOfRangeException("x");
}
является обычной.
FormatException
Это довольно разумный выбор, когда вы пишете свой собственный метод синтаксического анализа текстаили на самом деле любой код, который ожидает, что строки соответствуют определенному формату, и есть некоторые входные данные, которые код не может понять.
InvalidOperationException
Я часто использую этот код(вероятно, злоупотреблять им на самом деле) всякий раз, когда я не уверен, что еще использовать.Обычно я рассматриваю этот тип как передачу того, что клиент пытался сделать что-то недопустимое по причинам, относящимся к текущему классу или методу.
Пример
Многие реализации IEnumerator<T>
выдают InvalidOperationException
когда коллекция, которую они перечисляют, модифицируется.Это разумный выбор дизайна, так как гораздо проще создать класс коллекции, который не обрабатывает этот случай, чем создать класс, который это делает.
NotSupportedException
Обычно этот классимеет смысл в классе, который является производным от некоторого базового класса и предлагает только частичную реализацию abstract
членов этого базового класса.
Пример
Некоторые разработчики предпочитают писать базовые классы с "необязательным"функциональность, которая может быть предоставлена производными классами или не может быть.Ниже приведен пример:
abstract class Animal : Organism
{
public virtual bool EatsPlants
{
get { return false; }
}
public virtual void EatPlant(Plant food)
{
throw new NotSupportedException();
}
public virtual bool EatsAnimals
{
get { return false; }
}
public virtual void EatAnimal(Animal food)
{
throw new NotSupportedException();
}
}
class Herbivore : Animal
{
public override bool EatsPlants
{
get { return true; }
}
public override void EatPlant(Plant food)
{
// whatever
}
}
Очевидно, это просто мой личный (и субъективный) список;но я подумал, что это может дать вам представление о том, какие исключения вы можете и должны использовать в своем собственном коде.