В моем коде у меня часто бывают ситуации вроде этого:
public void MyMethod(string data)
{
AnotherClass objectOfAnotherClass = GetObject(data);
if (objectOfAnotherClass == null)
throw new WhatExceptionType1("objectOfAnotherClass is null.");
if (objectOfAnotherClass.SomeProperty < 0)
throw new WhatExceptionType2("SomeProperty must not be negative.");
}
Предположим, что GetObject
использует некоторые внешние библиотеки, которые не находятся под моим контролем, и что эта библиотека возвращает null
, если объект для data
не существует и считает отрицательным SomeProperty
как допустимое состояние и, следовательно, doesn 'исключение. Дальше представьте, что MyMethod
не может работать без objectOfAnotherClass
и не имеет смысла с отрицательным SomeProperty
.
Каковы правильные исключения для WhatExceptionType1/2
для этой ситуации?
В основном у меня было четыре варианта:
-
1)
InvalidOperationException
, потому чтоMyMethod
не имеет смысла в условиях, описанных выше. С другой стороны, рекомендации (и Intellisense в VS тоже) говорят о том, что необходимо исключить InvalidOperationException, если объект, к которому принадлежит метод, находится в недопустимом состоянии. Теперь сам объект не находится в недопустимом состоянии. Вместо этого входной параметрdata
и некоторые другие операции, основанные на этом параметре, приводят к ситуации, когдаMyMethod
больше не может работать. -
2)
ArgumentException
, потому что есть значения дляdata
, метод может работать с другими значениями, которые метод не может. Но я не могу проверить это, проверив толькоdata
, я должен вызвать другие операции, прежде чем решиться. -
3)
Exception
, потому что я не знаю, какой другой тип исключения использовать, и потому что все другие предопределенные исключения кажутся слишком специализированными и не подходят для моей ситуации. -
4)
MyCustomException
(мой собственный тип исключения, полученный изException
). Кажется, это всегда вариант, но я беспокоюсь, что мне приходится определять множество специальных классов исключений для многих разных условий ошибки, когда я начинаю следовать этому шаблону.
Есть ли другие и лучшие варианты? Каковы аргументы в пользу или против этих вариантов?
Благодарим вас за отзыв!