Вот вопрос, в котором сияет моя реальная программа программирования. У меня есть функция, которая вызывает вызов еще трех функций:
Public Sub StartService()
RunSearch()
SaveMessages()
DeleteMessages()
End Sub
в каждом из методов RunSearch(), SaveMessages() and DeleteMessages()
Я использую команды Try Catch для обнаружения ошибок. Прямо сейчас я улавливаю ошибку и записываю в журнал ошибок при ошибках RunSearch()
, но я также получаю две ошибки из SaveMessages()
и DeleteMessages()
, потому что эти функции зависят от RunSearch()
, не возвращая ошибку. Я пытаюсь создать хорошую ошибку, поймав фундамент, поэтому я не просто хочу убить приложение, когда есть ошибка. Мой вопрос заключается в следующем: как я могу изящно остановить выполнение, если в RunSearch()
возникает ошибка.
Почему RunSearch
не восстанавливает исключение после регистрации проблемы?
Если вы не хотите вызывать SaveMessages()
, если RunSearch()
терпит неудачу, не создавайте его таким образом.
Моя общая мысль заключается в том, что каждый интерфейс метода указывает "протокол". Он должен указать свое поведение в случае проблем. Подходы включают:
Один из возможных вариантов - изменить метод RunSearch, чтобы вернуть Boolean - True в случае успеха, и False, если произошла ошибка, которая блокировала бы две другие функции.
Тогда вы можете сделать это:
Public Sub StartService()
If RunSearch() Then
SaveMessages()
DeleteMessages()
End If
End Sub
Кажется, вам не нужны низкоуровневые обработчики ошибок на уровне методов, но только обработчик высокого уровня/уровня приложения. Если все блоки catch для каждого метода одинаковы, я бы предложил переключиться на высокоуровневый обработчик ошибок. Как правило, вы только хотите поймать Исключения, которые вы можете явно обработать, или поймать их при последней оппортунизации для целей ведения журнала, а также для предотвращения неопрятных сбоев приложений.
Вот как я подхожу к нему
public void StartService()
{
try
{
RunSearch();
SaveMessages();
DeleteMessages();
}
catch(Exception ex)
{
//Do Nothing or Log ex
}
}
public void RunSearch()
{
//No error handler here, as this method cannot recover from exceptions
//RunSearch functionality
}
Вы можете повторно удалить исключения метода после того, как вы выполнили регистрацию, а затем оберните свой метод RunSearch() внутри блока try/catch, чтобы следующие два метода не выполнялись.
Вы не должны использовать исключения для управления потоком программы. Вместо этого используйте возвращаемые значения. Выбрасывание и улавливание исключений являются дорогостоящими и должны использоваться только для сообщения о действительно неожиданных условиях в вашем коде.
Ответ Дэвида Стреттона выше - это гораздо лучшее решение.