Ловля базового класса исключений в .NET - PullRequest
19 голосов
/ 22 сентября 2008

Я продолжаю слышать, что

catch (Exception ex)

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

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

EDIT:

Люди говорят, что я должен просмотреть стек вызовов и конкретно обработать ошибки, потому что, например, исключение StackOverflow не может быть обработано осмысленно. Однако остановка процесса - это худший результат, я хочу предотвратить это любой ценой. Если я не смогу обработать StackOverflow, пусть так и будет - результат будет ничуть не хуже, чем вообще не перехватывать исключения, и в 99% случаев информирование пользователя является наименее плохим вариантом, насколько я понимаю. 1012 *

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

Ответы [ 16 ]

0 голосов
/ 01 апреля 2009

Это хорошо для ловли исключений, которые вы можете обработать. Но иногда бывает так, что из-за нестабильной среды или из-за того, что пользователи просто делают процесс правильно, приложение сталкивается с неожиданным исключением. Который вы не были перечислены или обработаны в коде. Есть ли способ, которым необработанное исключение захватывается из файла app.config и отображает общую ошибку?

Также помещает это сообщение об исключении деталей в файл журнала.

0 голосов
/ 03 декабря 2008

Я отвечаю на "Однако, остановка процесса - это худший результат ..."

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

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

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

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

0 голосов
/ 22 сентября 2008

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

1) для одноразового объекта вы можете использовать ключевое слово «using»: используя (SqlConnection conn = new SqlConnection (connStr)) { //код } как только вы выходите из области действия (обычно, с помощью оператора return или по исключению), метод Dispsose автоматически вызывается для объекта. другими словами, это похоже на конструкцию try / finally.

2) в asp.net вы можете перехватить событие Error или UnLoad объекта Page, чтобы освободить ваш ресурс.

Я надеюсь, что помогу тебе!

0 голосов
/ 22 сентября 2008

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

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

try {
   myThing.DoStuff();
}
catch (StuffGoneWrongException ex) {
   //figure out what you need to do or bail
}

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

0 голосов
/ 22 сентября 2008

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

0 голосов
/ 22 сентября 2008

Нет; в этом случае, если вы не хотите останавливать программу, вы больше ничего не можете сделать, и на верхнем уровне это правильное место, если вы входите в систему правильно и не скрываете ее в надежде усмешка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...