Существует простое правило: если вы не знаете, как обрабатывать исключение, не поймите его.
Поймать его и перенастроить нулевой или пустой список будет о худшем, что вы можете сделать, потому что будет трудно отлаживать, откуда исходит ошибка, или даже что произошла ошибка вообще. Если вы это сделаете, у вас появятся разработчики, вытягивающие волосы.
Ловля исключения и реорганизация его как throw e;
также плохо, потому что вы теряете исходный стек. Повторное использование с использованием throw;
в порядке, если у вас есть специальная очистка, вам нужно сделать это только в случае ошибки. Обычно это не так. Если у вас есть очистка, которая должна быть выполнена независимо от того, была или нет ошибка, она принадлежит в предложении finally.
В общем случае, если есть что-то разумное, что вы можете сделать, чтобы исправить ошибку, просто позвольте этому исключению выступать перед вызывающим. Вот как работают исключения.
Есть несколько раз, когда вы можете поймать исключение, чтобы добавить дополнительную информацию (например, для лесозаготовки), в этом случае вы должны убедиться, что вы используете InnerException
, чтобы избежать потерь исходной информации:
try
{
foo(bar);
}
catch (Exception e)
{
throw new FooException("Foo failed for " + bar.ToString(), e);
}
, но в целом лучше не делать этого, если у вас нет веской причины. Это не позволяет вашим пользователям перехватывать определенный тип исключения - они поймают ваше исключение, а затем им нужно будет включить тип InnerException. Не весело. Просто позвольте вызывающему абоненту увидеть исходное исключение.
Похоже, что вы должны обрабатывать это исключение только в своем слое презентации. Исключения должны быть исключительными. Используйте только исключения, если вы можете следовать другому логическому пути, основанному на возникающем исключении. –