![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Всем привет.
Заметил, что совсем не умею обрабатывать эксепшены :( 1) В 90% случаев просто логирую и/или показываю юзеру // т.е. ничего толкогового с информацией об ошибке не делаю. 2) Любимый catch блок -- catch (Exception ex) // А как же обрабатывать только конкретную ошибку? 3) Больше в голову ничего не приходит, но есть четкое ощущение, что я с эксцепшенами не дружу :( Что можете посоветовать, уважаемые форумчане? Зарание спасибо, ivashkanet. P.S. Если кто считает, что но еще! не "уважаемый" форумчанин -- спешу его поправить, для меня важно мнение каждого! |
|||
|
||||
| tol05 |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Я не философ, но свое мнение имею ... и его выскажу
В catch обычно нужно не только сообщения формировать или логировать для истории ... нужно закрывать ресурсы, чтобы приложение не вредило машине и работало дальше.
каждый конкретный exception - класс, производный от базового Exsception (например ArgumentException, InvalidOperationException и т.д.) поэтому и ловить нужно несколькими catch-ами
это не только удобочитаемо и культурно... каждый из классов Exception-ов имеет свои поля и свойства для дополнительной информации об ошибке, которых нет в базовом (иначе зачем создавать потомков, не так ли?). Если же у тебя какая-то кустомная ошибка может быть - создавай свои классы Exception-ов, я так часто делаю... Создаю свой класс Exception-а, который, к примеру, имеет поля типов DataRow, DataColumn, SessionId и т.д. и т.п. И если где-нибудь в иерархии происходит исключение и мне удается привести его к классу своего exception-а ... то польза от этого становится весьма и весьма ощутимой... К тому же порядок catch-ей важен, поскольку они обрабатываются в порядке указания их в коде. В моем примере если ты перенесешь catch(Exception ex) наверх, то он "закроет" исключения (потому как полиморизм исключений сработает) и catch (ArgumentException ex) будет всегда недостижим, а вместе с ним - и вся твоя дополнительная информация.
ммм... надо батенька, надо. действительно хорошие статьи: рекомендации по обработке исключений Exception Management Architecture Guide Это сообщение отредактировал(а) tol05 - 18.3.2008, 12:00 -------------------- На хорошей работе и сны хорошие снятся. |
||||||||
|
|||||||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
tol05, эхххььь, это теория. Я это все знаю :( Мне бы применять научиться...
Это я делаю, но неужели это все? Не верю! Можно ведь проанализировать эксепшен и, если это возможно, вернуться в начало, возможно что-то исправить, и повторить попытку (Server unaccessible)... Эт тоже в курсе А вот за статьи реально спасибо! Добавлено через 10 минут и 39 секунд Прочитал первую. Очень неплохой экскурс в правила "хорошего тона". Большое спасибо. Вторая -- многа букафф, отметил к прочтению. |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Пролистал вторую --- ИМХО, то что мне надо!
Но почему же так много букаффф Перенес "к прочтению" на "к прочтению сегодня на ночь" |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
а что? мало?
Исправить и вернуться - нельзя, т.к. исключение выбрасывает тебя их стека выполнения (стек очищается, кто его второй раз заполнит?). Но можно на верхнем уровне перехватить exception, подправить ситуацию и снова зайти в эту же функцию (это я чисто теоретически рассуждаю, вряд ли кто будет применять такой подход). В конце-концов главная наша задача - избавиться от ошибок до релиза, так что в идеале exception-ы будут выбрасываться редко и в ситуациях, не зависящих от твоего кода (сиквел-сервер не ответил, сеть отвалилась, юзер неграмотный и т.п.) - т.е. вряд ли тебе удастся что-то исправить и вернуться в метод... -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Как-то да Да, я когда писал понял, что это почти невероятная ситуация (именно поэтом у меня так много "возможно" |
|||
|
||||
| ivashkanet |
|
||||||||||||||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Прочитал. То что надо
Выжимки: Когда ловить исключения:
Требуемая информация по группам "пользователей":
Как получить требуемую информацию в коде:
Каждое приложение должно ловить исключение до того как оно попадет к конечному пользователю! Для этого используют: ASP .Net Cекцию customErrors файла web.config:
Дерективы конкретной страницы:
Код:
Самостоятельное приложение:
Так-то вот ;-) |
||||||||||||||
|
|||||||||||||||
| QryStaL |
|
|||
![]() Intellectual feast ![]() ![]() Профиль Группа: Участник Сообщений: 914 Регистрация: 30.11.2005 Репутация: 14 Всего: 32 |
-------------------- I don't need a reason being who I am... |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
ivashkanet Вот тебе несколько философских аксиом для размышлений: 1) Исключения можно генерировать только в исключительных случаях, никогдане используй исключения для управления потоком выполнения. 2) Исключения должны перехватываться только в том месте, где они могут быть обработаны с уровнем знаний достаточным для того, чтобы справиться с исключением наилучшим образом, например, выполнить откат. 3) Надо стремиться писать нейтральный к исключениям код, под этим понимается что ты сначала выполняешь тот код, который потенциально может генерировать исключение, и только потом фиксируешь изменение состояния при помощи операций 100% не генерирующих исключения. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 22 Всего: 118 |
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
Допустимо при использовании логирования или присоединения к исключению доп. информации. А перехватывать исключение лишь для того, чтобы пробросить его дальше - это дурно пахнет...
-------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Во некроманты
source777, за это время я столько литературы перелопатил... в том числе и про исключения. Тем более Exception Management Architecture Guide ответила на все мои вопросы. Первый пункт это очевидно, второй написан в статье и я даже перевел соответствующий кусок (см выше). В третьем вообще фигня какая-то написана. А если при фиксировании состояния объект выкидывает исключение (нарушение бизнес-правил)? И вообще это больше относиться к хорошему стилю программирования: разделение функциональности получающей данные от фиксирующей измения (грубо: читателей и писателей). |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
А я чё, я ничего... это QryStaL... да и прошло то меньше 3 месяцев... не 3 года всё-таки.
Ошибаешься, там очень полезная методика описана.
Грамотно применяя эту технику, можно писать нейтральный к исключениям код с минимальном кол-вом блоков try/catch... и возможностью отката при возникновении исключения. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Ну так переубеди меня Опять ничего не понятно. Раз затронул эту тему развивай ее: давай ссылки, примеры, ... ;-) Добавлено через 1 минуту и 16 секунд QryStaL, спасибо за статью, но "Exception Management Architecture Guide" все же покруче будет. |
|||
|
||||
| QryStaL |
|
|||
![]() Intellectual feast ![]() ![]() Профиль Группа: Участник Сообщений: 914 Регистрация: 30.11.2005 Репутация: 14 Всего: 32 |
Согласен. Эта статья просто в дополнение темы. -------------------- I don't need a reason being who I am... |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |