Предпочтительнее ли умирать? - PullRequest
18 голосов
/ 23 февраля 2009

Недавно я посещал учебные курсы Джеффри Рихтера по .NET. Он упоминает одну стратегию кодирования: «Умереть - это круто». То есть не пишите «catch (Exception ex)» даже в корне программы или цикла обработки событий. Если выдается какое-то исключение, которое не обрабатывается, просто дайте процессу умереть.

Я не уверен, что это правильно. Лично я предпочитаю иметь «try {...} catch(Exception ex) {log and try to recover}» для переноса на верхнем уровне исполнения. На самом деле, ASP.NET не умирает, если любое исключение выбрасывается из asXx. Если он умрет за исключение, то один запрос с применением серебряной пули может заставить замолчать весь сервис.

Что ты думаешь?

Ответы [ 16 ]

1 голос
/ 23 февраля 2009

Потрясающие ответы уже здесь, особенно от Simucal. Я просто хочу добавить точку:

Наступательное программирование отлично подходит для отладки. По моему опыту, «рано проваливаться, часто проваливаться» можно рассматривать как установку ловушек для ошибок в вашем коде. Когда что-то идет не так - будь то утечка памяти, сбой памяти, неожиданный NULL и т. Д. - обычно намного легче увидеть проблему, если программа сразу же завершается неудачей (с соответствующими данными отладки, такими как стек вызовов).

Защитное программирование отлично подходит для производственных сред. После того, как ваше приложение было отправлено, вы, возможно, не захотите, чтобы ваши конечные пользователи когда-либо увидели симпатичный маленький диалог с надписью «необработанное исключение в foo ()». Это может быть замечательно, если ваше приложение находится в бета-версии, и вы все еще собираете отладочную информацию, но если вы поставляете стабильное приложение, вы можете просто не беспокоить пользователя загадочным выводом в редких случаях, когда что-то не получается. 1005 *

Иногда это можно сделать обоими способами. Я часто писал код на C следующим образом:

void foo(char* data) {
    ASSERT(data);
    if (!data) { return; }
    // ... work with data
}

Если этот код скомпилирован в тестовой среде, оператор assert перехватывает условие ошибки. Если он скомпилирован в производственной среде, assert удаляется препроцессором и foo () завершается с ошибкой.

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

1 голос
/ 23 февраля 2009

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

Например, если вы пишете систему торговли в реальном времени, и есть непредвиденная ошибка, вам лучше позволить ей рухнуть. В противном случае ваша программа может продолжать работать и совершать глупые сделки. Пользователи сразу будут жаловаться на «WTF?», Но, по крайней мере, вы не потеряете миллионы долларов.

1 голос
/ 23 февраля 2009

Я говорю, что вы всегда должны иметь корневую ловушку исключений ... Особенно, если вы можете поместить в исключение какую-то информацию, сообщающую, что пошло не так, код или что-то еще, и распечатать ее для пользователя. Затем пользователь всегда может спросить вас (или поддержать или что-то еще), что пошло не так, и предоставить некоторую информацию ... вместо того, чтобы "он сломался с ошибкой защиты"

1 голос
/ 23 февраля 2009

Чего ожидает ваш клиент?

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

Иногда лучше позволить процессу умереть и создать другой для обработки запросов.

Иногда лучше попытаться решить проблему.

0 голосов
/ 23 февраля 2009

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

С другой стороны - я думаю, что люди перегружены целым менталитетом «исключения являются злом». Они являются инструментом, и при правильном использовании могут иметь удивительные льготы. Однако многие люди злоупотребляют ими, оборачивая root с помощью catch (Exception) ..

0 голосов
/ 23 февраля 2009

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

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

  • новые службы Windows предоставляют эту функцию при регистрации в MS.
  • установка drwatson также может собирать данные (файлы дампа), которые пользователи могут отправлять вам вручную.

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

По контракту API будут иметь тенденцию предоставлять способ сказать «могу ли я сделать это», а затем способ «сделать это», и многие API, такие как открытый MS-файл, позволят вам переключаться между повышением исключения и возвратом код ошибки.

...