Является ли обработка исключений сквозной проблемой?

13

Я не вижу большой разницы между проблемами обработки исключений и регистрации в них, поскольку оба являются сквозными проблемами. Как вы думаете? Разве это не должно обрабатываться отдельно, а не чередоваться с основной логикой, которую реализует метод?

РЕДАКТИРОВАТЬ : я пытаюсь сказать, что по моему мнению реализация метода должна содержать только логику для успешного пути выполнения и исключения должны обрабатываться в другом месте. Это не о проверенных / непроверенных исключениях.

Например, язык может обрабатывать исключения полностью проверенным способом с помощью таких конструкций:

class FileReader {

  public String readFile(String path) {
    // implement the reading logic, avoid exception handling
  }

}

handler FileReader {

   handle String readFile(String path) {
      when (IOException joe) {
        // somehow access the FileInputStram and close it
      }
   }

}

На приведенном выше концептуальном языке программа не будет компилироваться при отсутствии FileReader обработчика , поскольку readFile FileReader класса не выдает исключение. Таким образом, объявив FileReader обработчик , компилятор может убедиться, что он обрабатывается, а затем программа компилируется.

Таким образом, у нас есть лучшее из проверенных и непроверенных проблем исключений: надежность и читаемость.

Бехранг Саидзаде
источник

Ответы:

14

В некоторых случаях да

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

Большую часть времени нет

Однако возьмем экземпляр SocketListener, если socketlistener выдает исключение из-за разрыва соединения на другом конце, тогда это должно быть ожидаемым поведением, и поэтому приложение должно действовать в соответствии с обстоятельствами, вызвавшими исключение. Это не то, что должен обрабатывать общий аспект, и поэтому не должно быть сквозной проблемой.

Выявление сквозной проблемы

Если вы дублируете один и тот же код снова и снова, его необходимо абстрагировать. Если абстракция рекламируется на нескольких уровнях, это может быть сквозной проблемой. Только тогда это должно быть рассмотрено.

Джастин Шилд
источник
4

Регистрация необязательна. Обработка исключений не является.

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

По крайней мере, в моем ограниченном использовании двух это означает, что две цели лучше всего решать по-разному, а не под одним и тем же дизайном.

Патрик Хьюз
источник
1

Я рассматриваю обработку исключений как сквозную проблему для определенных типов исключений. Существуют локальные исключения, которые правильно обрабатывается только кодом непосредственного вызова. Примером может служить исключение базы данных при попытке выполнить запрос. Но есть и исключения, которые могут и должны рассматриваться более глобально. Примером может быть исключение, связанное с отсутствием учетных данных безопасности (вынудите пользователя войти снова). Или, по крайней мере, вам нужен глобальный обработчик на случай, если исключение проскальзывает через более конкретный код, чтобы объяснить пользователю, что он должен сделать, чтобы перезапустить или отправить журнал в ИТ или что-то в этом роде. Для этих типов глобально обработанных исключений это сквозная проблема.

RationalGeek
источник
0

Я думаю, что это связано с проблемой неплотных абстракций.

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

Тем не менее, «принцип утечки абстракций» является проблемой. Некоторые исключения не могут быть переведены в форму, которая имеет смысл на следующем уровне абстракции.

Исключением, связанным с сетевой файловой системой, является простой пример. Отказ сети не может быть выражен в терминах, которые имеют смысл для «файловой» абстракции или, если это так, то эта абстракция на самом деле не полностью абстрагирует все детали, относящиеся к реализации обработки файлов.

Таким образом, сбой сети будет вытекать из базовой абстракции сети, и поэтому он должен быть сквозной задачей в остальной части кода.

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

Steve314
источник