Это хорошо, что я иногда снижаю свои исключения?

У меня есть вопрос о лучших практиках. Я понимаю, что это субъективно, но требуется для выяснения у людей, более умных, чем я, если это - общая практика программирования.

Если у Вас есть метод чего-то НЕКРИТИЧЕСКОГО, что Вы не хотите вмешиваться в важное функционирование своего приложения, действительно ли распространено использовать ошибочный приемник как это?

Try 
    'do stuff.  not important if it fails.

Catch ex as exception
    'sink.  do nothing.
End Try

Если Вы думали о найме меня, и Вы читали часть моего кода и видели, что это... было бы Вы?

Seth

РЕДАКТИРОВАНИЕ, Ничего себе! Спасибо за Ваши ответы. Я думаю, что согласие, это никогда не должно делаться, или это должно быть очень редко.

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

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

В приложенном примечании было сказано, "если оно занимает больше времени, чем 15 минут... отбрасывают его".

Таким образом, я сталкиваюсь с добавлением, что является потенциально полезной функцией, но не действительно имеет время для тестирования этого, это не повредит рабочие функции. Для записи наш обработчик исключений для этой системы ДЕЙСТВИТЕЛЬНО имеет механизм для обработки и снижения или входа этих ошибок. Но что, если я работал над системой, которая не имела устойчивой системы обработки ошибок. Это должно было бы хорошо добавить эту опцию и если ошибка происходит..., ничто действительно не потеряно.

Это было моими взглядами. Но я принял Ваше сообщение близко к сердцу..., что в основном это - плохая идея.

Seth

36
задан Seth Spearman 26 January 2010 в 20:47
поделиться

21 ответ

Да, это обычно, но в целом это не должно быть сделано.

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

В большинстве случаев глотание System.Exception или System.systemexception неизбежно скрыт дальнейшие проблемы выполнения.

13
ответ дан 27 November 2019 в 06:02
поделиться

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

Вы ожидаете очень конкретное исключение, и знаете, что вы можете восстановить из него:

try {
 Integer.Parse(someString);
}
catch (ParseException pe) {
 //In this particular use case, if the string doesn't parse, 
 //I don't need to do anything. Logging a warning might be a
 //good idea, in some cases
}

Вы делаете код очистки:

beginDatabaseTransaction();
try {
 doSomeDatabaseOperation();
}
catch (Exception e) {
 log.error(e); //log the original exception
 try {
  rollbackDatabaseConnection();
 }
 catch(Exception e2) {
  //You may ignore this one-off exception, though
  //I would strongly consider logging it
 }
 throw; //rethrow the original exception and let it propagate
}

(это без означает лучшую практику для операций с базой данных; просто надуманный пример.)

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

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

Большинство исключений есть, чтобы помочь вам, разработчику, находить и диагностировать ошибки в вашем коде. Они предназначены для завершения завершения программы (или текущей операции), чтобы предотвратить непредсказуемое поведение (например, пытаться загрузить все записи в вашей базе данных, потому что вы не смогли построить предложение Where для вашего оператора SQL.) Когда вы поймаете неизвестное исключение, вы скрываете ошибку от вашего текущего кода и делаем возможным, чтобы код был неожиданно вести себя, вместо того, чтобы просто прекратить.

1
ответ дан 27 November 2019 в 06:02
поделиться

Начните с этого поста и перейдите по ссылкам. Или просто искать Носорога.

-121--3926444-

Если вы не возражаете против книги с финансовым откосом, моя первоначальная оценка Monte Carlo Frameworks: Building Customizable High-Performance C++ Applications очень позитивна.

-121--3505023-

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

0
ответ дан 27 November 2019 в 06:02
поделиться

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

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

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

1
ответ дан 27 November 2019 в 06:02
поделиться

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

try {
   Cache.refresh(myObject)
}
catch (NotInCacheException) {
   // If the object isn't already in the cache, then we don't have to worry 
   // about refreshing it. It's assumed that this is a common occurrence,
   // so we don't need to log it either; that ends up just spamming
   // the logs. So, just swallow it, silently.
}

(Примечание: должен ли cache.refresh () должен быть выбрасывать неотъемлемоеexeexception вообще не в выдаче здесь; я просто использую это как быстрый пример).

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

Также: если у вас есть гибкая структура ведения журнала, вы, возможно, захотите в любом случае в систему в системе этого исключения в информационные цели. Я думаю о Log4net / log4j, в частности, здесь: вы можете настроить свой журнал (во время выполнения даже), чтобы выбрать / игнорировать исключения, основанные на классе и серьезности. Таким образом, вы можете заставить замолчать эти типы исключений в нормальных обстоятельствах, но входят в систему, если вы хотите сделать немного покринга по вашему приложению.

Если вы решите проглотить исключение, моя политика в всегда имеет комментарий код, объясняющий, почему вы сделали это; Это отмечает его не только еще одну плохую практику.

1
ответ дан 27 November 2019 в 06:02
поделиться

Лично я вижу это как невероятно плохую практику.

Это (к сожалению) Один из вещей, которые я всегда ищу при рассмотрении кода, и вопросы, которые я задаю, когда я нахожу пустые блоки уловки или лобят, что по существу, исключениям глотания:

  1. в этот момент На 100% уверен, что это исключение никогда не имеет значения?
  2. Вы также на 100% уверены, что любое исключение, пойманное здесь в будущем, никогда не будет иметь значения, независимо от того, как разрабатывается кодовая база?
  3. Даже если 1 и два являются верными это действительно так сложно положить здесь какую-то вход в систему?

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

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

4
ответ дан 27 November 2019 в 06:02
поделиться

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

Я признаю: я проглотил исключения и в каждом случае это было потому, что ИМХО дизайнер функции прикручена .

«Исключения» означает «исключения», а не сбой или ошибка. То, что я имею в виду: если функция должны признать, что вход может быть не правильным, я ожидаю, что функция делает Не используйте исключения. Мои гнев целены в частности, «ParseException».

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

Почему?

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

Если вы называете параметры параметра несколько тысяч или миллионов (!) Раз, вы забиваете свой файл журнала для точно ничего.

В отличие от моей идеальной функции возвращает объект класса с кодом состояния и сообщение, как

StatCode stat = parseXYZ(Reader r);

, который можно проверить.

if (stat.code != OK)  
  //whatever

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

5
ответ дан 27 November 2019 в 06:02
поделиться

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

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

7
ответ дан 27 November 2019 в 06:02
поделиться

Я делаю это только на надоедливых отрывках вроде закрытия соединения:

try {
   conn.close()
}
catch( Exception e ) {
}

потому что я уже уверен, что оно мне больше не нужно.

0
ответ дан 27 November 2019 в 06:02
поделиться

Я бы сказал: "Не делай этого" - не так.

Прежде всего, попробуйте рефакторинг "некритичного" кода, чтобы он не бросал исключение.

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

0
ответ дан 27 November 2019 в 06:02
поделиться

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

 System.Diagnostics.Debug.WriteLine("exception in method - my method -: "+ex.message);
0
ответ дан 27 November 2019 в 06:02
поделиться

PHP имеет Domdocument для навигации на DOM. Я не слышал о том, чтобы выполнить JavaScript.

-121--3926443-

лучшие практики для обработки исключений (MSDN) :

В соответствии с ними вы можете либо

сделать что-то с ошибкой или игнорировать ее.

Это зависит от вас и вашей команды, чтобы решить, я думаю.

1
ответ дан 27 November 2019 в 06:02
поделиться

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

Я бы не использовал структуру TRY CALL или Refactor код в методе, который возвращает логию, так что я, по крайней мере, могу определить, если он преуспеет или нет ...

Это моя мысль ...

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

4
ответ дан 27 November 2019 в 06:02
поделиться

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

5
ответ дан 27 November 2019 в 06:02
поделиться

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

Серьезно, хотя в Java (например)) Исключения используются для определенных случаев, которые вы можете игнорировать, как Filenotfoundexception (Как вы сделали, с комментарием). Но если вы когда-нибудь поймаете тип исключения - вроде IOException - вы не можете просто скрыть это. Если исключение ничего не значит для вас, оберните его в Runtimeexception и выбросить его к клиенту.

Где-то по пути Исключение должно быть обработано, но никогда не скрывало.

8
ответ дан 27 November 2019 в 06:02
поделиться

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

Я узнал о эффективном использовании исключения в значке. Значок имеет эту аккуратную вещь, называемую «неудачу». Если выражение не имеет значения, он может вернуть, он вместо этого не удается. Это функционирует как миниатюрное исключение только вместо TRY {} CATH {} Обозначения, сбой обрабатывается непосредственно языковыми элементами, такими как , если и в то время как .

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

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

0
ответ дан 27 November 2019 в 06:02
поделиться

Частичным решением является AJAX. Например, напишите код проверки на сервере и сообщите о том, действителен ли ввод, и попросите выдать сообщение об ошибке, если нет.

-121--3383559-

json _ encode и json _ decode являются отличным началом - таким же источником данных, доступным в php-массивах и json-объектах, как требуется.

json_encoded данные можно обслуживать с помощью < скрипт > тэгов или ajax по вашему усмотрению.

-121--3383560-

Следует провести различие между игнорируемыми исключениями и фатальными исключениями. Я не уверен, как это делается в VB, но в Java (например) исключения, полученные из Ошибка , не должны никогда игнорироваться. Сюда относятся ошибки загрузчика классов, состояние нехватки памяти, переполнение стека и т.д.

1
ответ дан 27 November 2019 в 06:02
поделиться

Нет, это не в порядке, на мой взгляд.

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

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

1
ответ дан 27 November 2019 в 06:02
поделиться

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

d={}
for i in theList:
  try:
    d[i] += 1
  except KeyError:
    d[1] = 1

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

0
ответ дан 27 November 2019 в 06:02
поделиться

Как новичок, назначенный для исправления ошибок, я обнаружил, что конкретная ошибка, которая была мне назначена, печатала (для отладки) "Этого никогда не должно было случиться". После того, как я избавился от страха работать в состоянии ошибки, которое, по-видимому, было невозможно, мне наконец-то удалось обнаружить, что это было вызвано тонким состоянием гонки. Если бы автор этого кода изначально просто потопил исключение без хотя бы этого скудного отладочного утверждения, отследить состояние гонки было бы гораздо сложнее.

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

1
ответ дан 27 November 2019 в 06:02
поделиться

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

1
ответ дан 27 November 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: