Когда целесообразно использовать метод ThrowHelper вместо прямого металирования?
void MyMethod() {
...
//throw new ArgumentNullException("paramName");
ThrowArgumentNullException("paramName");
...
}
void ThrowArgumentNullException(string paramName) {
throw new ArgumentNullException(paramName);
}
Я читал, что вызов метода ThrowHelper (метод с единственным пурпуром для исключения исключений) вместо того, чтобы бросать напрямую, должен давать меньший байт-код.
Это и очевидная инкапсуляция (другой слой косвенности) могут быть вескими причинами, чтобы не бросать напрямую, по крайней мере в некоторых сценариях.
Во всяком случае, ИМО недостатки тоже не несущественны.
- Часть (исключительного) потока управления скрыта
- Исключения заканчиваются тем, что имеют более критический стек.
- компилятор (2.0) не будет распознавать, что вызовы ThrowHelper являются точками выхода из метода, поэтому необходим некоторый код.
Мой ограниченный опыт заключается в том, что часто общий дизайн ухудшается.
int MyMethod(int i) {
switch (i) {
case 1:
return 1;
default:
ThrowMyException();
}
return 0; // Unreachable (but needed) code
}
Это отчасти может быть вопросом личного вкуса. В любом случае, каковы ваши личные рекомендации по этой проблеме? Вы находите, что рекомендуется использовать ThrowHelpers для всех таких общих задач, как проверка параметров метода (ThrowArgumentNullException (paramName) и т.д.)? Не хватает ли я чего-то очевидного в этой проблеме?
Btw Я пытаюсь не смешивать эту проблему с проблемой проверки, например. например:
ThrowIfNameIsNullOrEmpty(name);