Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Философия обработки Exception-ов, Может кто видел !хорошие! статьи или кни 
:(
    Опции темы
ivashkanet
Дата 18.3.2008, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Всем привет. 

Заметил, что совсем не умею обрабатывать эксепшены :( 

1) В 90% случаев просто логирую и/или показываю юзеру // т.е. ничего толкогового с информацией об ошибке не делаю.
2) Любимый catch блок -- catch (Exception ex) // А как же обрабатывать только конкретную ошибку?
3) Больше в голову ничего не приходит, но есть четкое ощущение, что я с эксцепшенами не дружу :( 


Что можете посоветовать, уважаемые форумчане?

Зарание спасибо, ivashkanet.

P.S. Если кто считает, что но еще! не "уважаемый" форумчанин -- спешу его поправить, для меня важно мнение каждого!


PM MAIL WWW ICQ   Вверх
tol05
Дата 18.3.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Я не философ, но свое мнение имею ... и его выскажу  smile 

Цитата(ivashkanet @  18.3.2008,  09:33 Найти цитируемый пост)
1) В 90% случаев просто логирую и/или показываю юзеру // т.е. ничего толкогового с информацией об ошибке не делаю.

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


Цитата(ivashkanet @  18.3.2008,  09:33 Найти цитируемый пост)
2) Любимый catch блок -- catch (Exception ex) // А как же обрабатывать только конкретную ошибку?

каждый конкретный exception - класс, производный от базового Exsception (например ArgumentException, InvalidOperationException и т.д.) поэтому и ловить нужно несколькими catch-ами 
Код

catch (InvalidOperationException ex) ...
catch (ArgumentException ex) ...
catch (Exception ex) ...

это не только удобочитаемо и культурно... каждый из классов Exception-ов имеет свои поля и свойства для дополнительной информации об ошибке, которых нет в базовом (иначе зачем создавать потомков, не так ли?). Если же у тебя какая-то кустомная ошибка может быть - создавай свои классы Exception-ов, я так часто делаю... Создаю свой класс Exception-а, который, к примеру, имеет поля типов DataRow, DataColumn, SessionId и т.д. и т.п. И если где-нибудь в иерархии происходит исключение и мне удается привести его к классу своего exception-а ... то польза от этого становится весьма и весьма ощутимой...

К тому же порядок catch-ей важен, поскольку они обрабатываются в порядке указания их в коде. В моем примере если ты перенесешь catch(Exception ex) наверх, то он "закроет" исключения (потому как полиморизм исключений сработает) и catch (ArgumentException ex) будет всегда недостижим, а вместе с ним - и вся твоя дополнительная информация.


Цитата(ivashkanet @  18.3.2008,  09:33 Найти цитируемый пост)
3) Больше в голову ничего не приходит, но есть четкое ощущение, что я с эксцепшенами не дружу :( 

ммм... надо батенька, надо. smile
действительно хорошие статьи:
рекомендации по обработке исключений
Exception Management Architecture Guide

Это сообщение отредактировал(а) tol05 - 18.3.2008, 12:00


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
ivashkanet
Дата 18.3.2008, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



tol05, эхххььь, это теория. Я это все знаю :( Мне бы применять научиться...

Цитата(tol05 @  18.3.2008,  10:55 Найти цитируемый пост)
нужно закрывать ресурсы, чтобы приложение не вредило машине и работало дальше.

Это я делаю, но неужели это все? Не верю! 
Можно ведь проанализировать эксепшен и, если это возможно, вернуться в начало, возможно что-то исправить, и повторить попытку (Server unaccessible)...
Цитата(tol05 @  18.3.2008,  10:55 Найти цитируемый пост)
это не только удобочитаемо ...

Эт тоже в курсе smile 

А вот за статьи реально спасибо!

Добавлено через 10 минут и 39 секунд
Цитата(ivashkanet @  18.3.2008,  11:11 Найти цитируемый пост)
А вот за статьи реально спасибо! 

Прочитал первую. Очень неплохой экскурс в правила "хорошего тона". Большое спасибо. 
Вторая -- многа букафф, отметил к прочтению.
PM MAIL WWW ICQ   Вверх
ivashkanet
Дата 18.3.2008, 12:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Пролистал вторую --- ИМХО, то что мне надо! 
Но почему же так много букаффф  smile  smile 
Перенес "к прочтению" на "к прочтению сегодня на ночь"  smile 
PM MAIL WWW ICQ   Вверх
tol05
Дата 18.3.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Цитата(ivashkanet @  18.3.2008,  11:11 Найти цитируемый пост)
Это я делаю, но неужели это все? Не верю! 

а что? мало?  smile

Цитата(ivashkanet @  18.3.2008,  11:11 Найти цитируемый пост)
Можно ведь проанализировать эксепшен и, если это возможно, вернуться в начало, возможно что-то исправить, и повторить попытку (Server unaccessible)


Исправить и вернуться - нельзя, т.к. исключение выбрасывает тебя их стека выполнения (стек очищается, кто его второй раз заполнит?). 

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

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



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
ivashkanet
Дата 18.3.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(tol05 @  18.3.2008,  13:24 Найти цитируемый пост)
а что? мало?

Как-то да smile Я же говорю не до конца понимаю принципы smile 

Цитата(tol05 @  18.3.2008,  13:24 Найти цитируемый пост)
т.е. вряд ли тебе удастся что-то исправить и вернуться в метод...

Да, я когда писал понял, что это почти невероятная ситуация (именно поэтом у меня так много "возможно" smile
PM MAIL WWW ICQ   Вверх
ivashkanet
  Дата 19.3.2008, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Прочитал. То что надо  smile Где бы еще опыта получить... smile 

Выжимки:

Когда ловить исключения:
Цитата

Ловите (catch) только когда вы хотите сделать любое действие из:
    * Собрать информацию для логирования
    * Добавить существенную информацию к исключению
    * Выполнить очистку ресурсов
    * Попробовать восстанвиться (Attempt to recover)


Требуемая информация по группам "пользователей":
Цитата

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

Разработчики:
Дата и время возникновения ислючения.
Точное расположение в коде.
Тип исключения.
Информация, ассоциированная с исключением и состояние системы в момент возникновения ошибки

Операторы:
Дата и время возникновения ислючения.
Точное расположение в коде.
Тип исключения.
Кого нужно известить и какую информацию им передать
Тип исключения показывающий была ли это проблема ресурсов или кода.


Как получить требуемую информацию в коде:
Цитата

Дата и время возникновения:    DateTime.Now
Имя машины:  Environment.MachineName
Источник исключения  Exception.Source
Тип исключения  Type.FullName obtained from Object.GetType
Сообщение    Exception.Message
Стэк вызовов исключения  Exception.StackTrace—стек вызовов начиная с точки где была выброшена и наполняется по мере пробрашивания вверх по стеку вызовов
Стек вызовов  Environment.StackTrace — полный стек вызовов.
Имя домена приложения  AppDomain.FriendlyName
Имя сборки  AssemblyName.FullName, в System.Reflection пространстве имен
Версия приложения  Included in the AssemblyName.FullName
ID потока  AppDomain.GetCurrentThreadId
Thread user  Thread.CurrentPrincipal in the System.Threading namespace


Каждое приложение должно ловить исключение до того как оно попадет к конечному пользователю!
Для этого используют:
ASP .Net 
Cекцию customErrors файла web.config:
Код

<customErrors defaultredirect="http://hostname/error.aspx" mode="on">   
  <error statuscode="500" redirect="/errorpages/servererror.aspx" />
  <error statuscode="404" redirect="/errorpages/filenotfound.htm" />
</customErrors>

Дерективы конкретной страницы:
Код

<%@ Page ErrorPage="customerror.aspx" %>

Код:
Код

// In global.asax file
protected void Application_Error(Object sender, EventArgs e)
{
      Exception exc = Server.GetLastError();
      // Perform logging, send any notifications, etc.
}

// на самой странице
Page.Error += new System.EventHandler(Page_Error);


Самостоятельное приложение:

Код

[STAThread] 
static void Main() 
{
  Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

  // пошел код
}


Так-то вот ;-)
PM MAIL WWW ICQ   Вверх
QryStaL
Дата 10.6.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Вот еще интересная статья
http://blogs.msdn.com/kcwalina/archive/200...ierarchies.aspx


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
source777
Дата 10.6.2008, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(tol05 @  18.3.2008,  11:55 Найти цитируемый пост)
В catch обычно нужно не только сообщения формировать или логировать для истории ... нужно закрывать ресурсы, чтобы приложение не вредило машине и работало дальше.
Лол, приехали,  закрывать ресурсы надо в блоках finally!!!


ivashkanet Вот тебе несколько философских аксиом для размышлений:
1) Исключения можно генерировать только в исключительных случаях, никогдане используй исключения для управления потоком выполнения.
2) Исключения должны перехватываться только в том месте, где они могут быть обработаны с уровнем знаний достаточным для того, чтобы справиться с исключением наилучшим образом, например, выполнить откат.
3) Надо стремиться писать нейтральный к исключениям код, под этим понимается что ты сначала выполняешь тот код, который потенциально может генерировать исключение, и только потом фиксируешь изменение состояния при помощи операций 100% не генерирующих исключения.


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
jonie
Дата 10.6.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
source777
Дата 10.6.2008, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(jonie @  10.6.2008,  22:29 Найти цитируемый пост)
что скажете насчет проброски иключений ? 
Допустимо при использовании логирования или присоединения к исключению доп. информации. А перехватывать исключение лишь для того, чтобы пробросить его дальше - это дурно пахнет... 



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
ivashkanet
Дата 11.6.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Во некроманты  smile 
source777, за это время я столько литературы перелопатил... в том числе и про исключения.
Тем более Exception Management Architecture Guide ответила на все мои вопросы.

Первый пункт это очевидно, второй написан в статье и я даже перевел соответствующий кусок (см выше).
В третьем вообще фигня какая-то написана. 
А если при фиксировании состояния объект выкидывает исключение (нарушение бизнес-правил)? 
И вообще это больше относиться к хорошему стилю программирования: разделение функциональности получающей данные от фиксирующей измения (грубо: читателей и писателей).
PM MAIL WWW ICQ   Вверх
source777
Дата 11.6.2008, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: 4
Всего: 56



Цитата(ivashkanet @  11.6.2008,  11:11 Найти цитируемый пост)
Во некроманты  smile 
А я чё, я ничего... это QryStaL... да и прошло то меньше 3 месяцев... не 3 года всё-таки.


Цитата(ivashkanet @  11.6.2008,  11:11 Найти цитируемый пост)
В третьем вообще фигня какая-то написана. 

Ошибаешься, там очень полезная методика описана.

Цитата(ivashkanet @  11.6.2008,  11:11 Найти цитируемый пост)
А если при фиксировании состояния объект выкидывает исключение (нарушение бизнес-правил)? 
В том то вся и фишка, фиксирование состояние производится операциями, которые гарантировано не генерируют исключений, например, присваивание ссылок. Для подобных методов даже спец. атрибут есть [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]

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



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
ivashkanet
Дата 11.6.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(source777 @  11.6.2008,  14:13 Найти цитируемый пост)
Ошибаешься, там очень полезная методика описана.

Ну так переубеди меня smile 

Цитата(source777 @  11.6.2008,  14:13 Найти цитируемый пост)
В том то вся и фишка, фиксирование состояние производится операциями, которые гарантировано не генерируют исключений, например, присваивание ссылок. Для подобных методов даже спец. атрибут есть [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]

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

Опять ничего не понятно. smile 
Раз затронул эту тему развивай ее: давай ссылки, примеры, ... ;-)

Добавлено через 1 минуту и 16 секунд
QryStaL, спасибо за статью, но "Exception Management Architecture Guide" все же покруче будет.
PM MAIL WWW ICQ   Вверх
QryStaL
Дата 11.6.2008, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Цитата(ivashkanet @  11.6.2008,  14:26 Найти цитируемый пост)
"Exception Management Architecture Guide" все же покруче будет

Согласен. Эта статья просто в дополнение темы.


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0592 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.