Как я могу изящно закрыть свое приложение в случае ошибки?

2

Вот вопрос, в котором сияет моя реальная программа программирования. У меня есть функция, которая вызывает вызов еще трех функций:

Public Sub StartService()
    RunSearch()
    SaveMessages()
    DeleteMessages()
End Sub

в каждом из методов RunSearch(), SaveMessages() and DeleteMessages() Я использую команды Try Catch для обнаружения ошибок. Прямо сейчас я улавливаю ошибку и записываю в журнал ошибок при ошибках RunSearch(), но я также получаю две ошибки из SaveMessages() и DeleteMessages(), потому что эти функции зависят от RunSearch(), не возвращая ошибку. Я пытаюсь создать хорошую ошибку, поймав фундамент, поэтому я не просто хочу убить приложение, когда есть ошибка. Мой вопрос заключается в следующем: как я могу изящно остановить выполнение, если в RunSearch() возникает ошибка.

Теги:
error-handling

5 ответов

5
Лучший ответ

Почему RunSearch не восстанавливает исключение после регистрации проблемы?

Если вы не хотите вызывать SaveMessages(), если RunSearch() терпит неудачу, не создавайте его таким образом.

Моя общая мысль заключается в том, что каждый интерфейс метода указывает "протокол". Он должен указать свое поведение в случае проблем. Подходы включают:

  • Если я получу ошибку, я закончу процесс. Это довольно экстремально, ограничивает возможность повторного использования вашего метода.
  • Я верну счет или код состояния или что-то подобное. Это зависит от вас, чтобы решить, следует ли проверять это, и позволяет ли какой-либо конкретный код состояния безопасно использовать какой-либо другой метод. Я предпочитаю не полагаться на клиента, чтобы не забывать проверять коды состояния.
  • Если я потерплю неудачу, я оставлю вещи, чтобы последующая обработка была разумной. Например, если моя задача - создать связанный список, тогда в случае ошибок я не оставлю оборванный указатель или инициализированный список. Вы можете получить пустой список, но по крайней мере хорошо сформированная последующая обработка будет работать. Это имеет тенденцию подразумевать некоторую степень согласия (т.е. Связь) с другими методами. Это часто самый приятный подход, особенно в сочетании с хорошим протоколированием проблем.
  • Я сделаю исключение, если не смогу выполнить эту работу. Исключение укажет, есть ли вероятность того, что работа будет работать позже, если вы снова вызовете (я довольно часто использую TransientException и InvalidRequestException). Исключения полезны, потому что клиент не может (для проверенных исключений Java) случайно их игнорировать. При решении таких проблем, как "невозможно открыть базу данных", это кажется разумным. Мы действительно не хотим, чтобы люди ошибались "не могли даже добраться до базы данных", "у этого человека нет судимости".
  • 0
    Еще одно хорошее предложение. Недурно и голос за тебя и @Rob Thijssen.
  • 0
    Ааа. Этот ответ все о дизайне. это настолько заманчиво погрузиться в написание кода, но это, безусловно, помогает иметь ряд вещей, о которых нужно подумать (и задокументировать ответы) в первую очередь.
3

Один из возможных вариантов - изменить метод RunSearch, чтобы вернуть Boolean - True в случае успеха, и False, если произошла ошибка, которая блокировала бы две другие функции.

Тогда вы можете сделать это:

Public Sub StartService()
    If RunSearch() Then
        SaveMessages()
        DeleteMessages()
    End If
End Sub
1

Кажется, вам не нужны низкоуровневые обработчики ошибок на уровне методов, но только обработчик высокого уровня/уровня приложения. Если все блоки 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
}
  • 0
    если вы отступите в коде 4 пробела, мы получим подсветку синтаксиса ...
  • 0
    Без обид, Мэтт, но если вопрос на VB от допущенного новичка, я рекомендую ответить на VB.
Показать ещё 1 комментарий
1

Вы можете повторно удалить исключения метода после того, как вы выполнили регистрацию, а затем оберните свой метод RunSearch() внутри блока try/catch, чтобы следующие два метода не выполнялись.

0

Вы не должны использовать исключения для управления потоком программы. Вместо этого используйте возвращаемые значения. Выбрасывание и улавливание исключений являются дорогостоящими и должны использоваться только для сообщения о действительно неожиданных условиях в вашем коде.

Ответ Дэвида Стреттона выше - это гораздо лучшее решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню