Не перехватывать исключение, если вы не можете его обработать. Если вы возвращаете только какое-то значение, вызывающий метод должен проверить, является ли значение реальным результатом или просто индикатором исключения. И теперь этот метод должен решить, что делать, и вернуть. И метод, вызывающий этот метод. И метод ...
Так что просто позвольте исключению всплывать в стеке и ловить его где-нибудь, где вы можете его обработать. Может быть, непосредственно под пользовательским интерфейсом, а затем отобразить окно сообщения с вопросом, хочет ли пользователь повторить попытку или отобразить информацию о том, как решить проблему. Если у вас нет пользовательского интерфейса, найдите его где-нибудь, где вы можете решить проблему, и повторите попытку. Если это временная проблема, повторите всю задачу на разумном уровне, пока вызов не будет успешным.
Если вы хотите что-то записать, используйте следующую схему, чтобы записать исключение и сбросить его.
try
{
DoStuff();
}
catch (Exception exception)
{
Log(exception.ToString());
throw;
}
Обратите внимание, что это throw;
, а не throw exception;
. Если вы сделаете это позже, вы потеряете исходную трассировку стека. Если вы можете сделать более подробную информацию о причине исключения, вам следует превратить пойманное исключение в более значимое исключение с дополнительной информацией.
try
{
DoStuff();
}
catch (SpecificMeaninglessException exception)
{
Log(exception.ToString());
throw new MeaningfulException("Details about the error.", exception);
}
catch (Exception exception)
{
Log(exception.ToString());
throw;
}