Почему обработка исключений плохая? - PullRequest
87 голосов
/ 15 ноября 2009

Язык Google Go не имеет исключений в качестве выбора дизайна, а Линус из известности Linux назвал исключения дерьмом. Почему?

Ответы [ 15 ]

1 голос
/ 16 июня 2015

Я не прочитал все остальные ответы, поэтому об этом уже говорилось, но одна критика состоит в том, что они приводят к разрыву программ в длинных цепочках, что затрудняет отслеживание ошибок при отладке кода. Например, если Foo () вызывает Bar (), который вызывает Wah (), который вызывает ToString (), то случайное добавление неверных данных в ToString () в конечном итоге выглядит как ошибка в Foo (), почти полностью не связанной функции.

1 голос
/ 11 декабря 2012

Парадигма обработки исключений в C ++, которая образует частичную основу для Java, и, в свою очередь, .net, вводит некоторые хорошие концепции, но также имеет некоторые серьезные ограничения. Одна из ключевых целей разработки обработки исключений - позволить методам гарантировать, что они будут либо удовлетворять свои постусловия, либо выдавать исключение, а также гарантировать, что произойдет любая очистка, которая должна произойти до выхода из метода. К сожалению, парадигмы обработки исключений в C ++, Java и .net не могут обеспечить каких-либо хороших средств для обработки ситуации, когда непредвиденные факторы препятствуют выполнению ожидаемой очистки. Это, в свою очередь, означает, что нужно либо рискнуть, когда все остановится, если произойдет что-то неожиданное (подход C ++ к обработке исключения во время разматывания стека), принять возможность того, что условие не может быть решено из-за возникшей проблемы во время очистки стека будет принят за ошибку, которую можно решить (и могло бы случиться, если бы очистка прошла успешно), или допустим, что неразрешимая проблема, чья очистка стека вызывает очистку, вызывает исключение, которое обычно разрешается, незамеченным, поскольку код, который обрабатывает последнюю проблему, объявляет ее «решенной».

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

0 голосов
/ 13 сентября 2013

Для меня вопрос очень прост. Многие программисты используют обработчик исключений не по назначению. Чем больше языковой ресурс, тем лучше. Быть способным обрабатывать исключения - это хорошо. Одним из примеров неправильного использования является значение, которое должно быть целым числом, которое не должно быть проверено, или другое входное значение, которое может делиться и не проверяться на деление на ноль ... обработка исключений может быть простым способом избежать дополнительной работы и серьезного мышления, программист Возможно, вы захотите сделать грязный ярлык и применить обработку исключений ... Утверждение: «профессиональный код НИКОГДА не терпит неудачу» может быть иллюзорным, если некоторые из проблем, обрабатываемых алгоритмом, по своей природе являются неопределенными. Возможно, в неизвестных ситуациях от природы хорошо вступают в игру обработчики исключений. Надлежащая практика программирования является предметом споров.

0 голосов
/ 13 ноября 2010

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

Для сигнализации об ошибках я обычно предпочитаю сигналы об ошибках. Все зависит от API, варианта использования и серьезности, или если достаточно регистрации. Также я пытаюсь переопределить поведение и throw Phonebooks() вместо этого. Идея в том, что «Исключения» часто являются тупиками, но «Телефонная книга» содержит полезную информацию о восстановлении после ошибок или альтернативных маршрутах выполнения. (Хороший вариант использования пока не найден, но продолжайте попытки.)

0 голосов
/ 15 ноября 2009
  • Исключение, которое не обрабатывается, как правило, плохо.
  • Исключительно плохо обрабатывается исключение (конечно).
  • «Хорошие / плохие» обработки исключений зависят от контекста / области действия и целесообразности, а не ради этого.
...