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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват всех исключений приложения 
:(
    Опции темы
gambit
Дата 4.11.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 3
Всего: 40



Добрый день. Скажите можно ли реализовать в шарпе такую штуку?
М моем приложении будет журнал событий, в который записываются ошибки и все остальное, в наиболее важных и ключевых местах я естественно ставлю try {}, но каждую строчку не выделишь, а ошибку может произойти там где меньше всего ее ожидаешь. Так вот вопрос: можно ли сделать такую функцию, которая перехватывала бы любой исключение необработанное блоком try?
PM MAIL ICQ Skype   Вверх
Bogdan1024
Дата 4.11.2008, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 3
Всего: 13



Если у тебя windows-приложение (я предполагаю), то можешь написать в Program.cs:
Код

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            try
            {
                Application.Run(new Form1());
            }
            catch { }//Хватаем.
        }




--------------------
user posted image
PM MAIL   Вверх
elbjarn
Дата 4.11.2008, 16:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 1
Всего: 3



я уже поднимал когда-то такой вопрос на форуме:
http://forum.vingrad.ru/forum/topic-231495.html

Рихтер, как справедливо замечено в той теме, не рекомендует так поступать: приложение не должно "проглатывать" все исключения подряд. исключение как раз для того и предназначено, что означает исключительную ситуацию. по-хорошему, каждое исключение нужно отлавливать по-своему, потому что в разных местах логика работы программы (и соответственно логика обработки ошибок) разная. задача "поймать все исключения и по возможности молчаливо продолжить работу" актуальна только в том случае, если вам достался недорелиз, который завтра надо показывать заказчику, а в нем багов немеряно. в остальных ситуациях просто надо ловить ошибки в тех местах, где они могут быть, вот и всеsmile
PM MAIL ICQ   Вверх
PashaPash
Дата 4.11.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 9
Всего: 49



AppDomain.UnhandledException Event и остальные методы в его Remarks. Перед использованием прочитать документацию и Exception Handling Guidelines

Добавлено через 3 минуты и 21 секунду
ЗЫ elbjarn, работает в .NET Compact Framework ;)


--------------------
PM MAIL WWW   Вверх
gambit
Дата 4.11.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 3
Всего: 40



Цитата(elbjarn @  4.11.2008,  16:38 Найти цитируемый пост)
приложение не должно "проглатывать" все исключения подряд.



Цитата(gambit @  4.11.2008,  16:29 Найти цитируемый пост)
 в наиболее важных и ключевых местах я естественно ставлю try {}, но каждую строчку не выделишь, а ошибку может произойти там где меньше всего ее ожидаешь.


PM MAIL ICQ Skype   Вверх
Partizan
Дата 5.11.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



PashaPash, 
Насколько я знаю, AppDomain.UnhandledException Event не произойдёт, если исключение будет брошено в каком-нить "левом" потоке приложения....


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PashaPash
Дата 5.11.2008, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 9
Всего: 49



Partizan, про левый поток - это Application.ThreadException


--------------------
PM MAIL WWW   Вверх
Partizan
Дата 5.11.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



ааа...точно...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Мурлыкатам_
Дата 14.11.2008, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



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

Заворачивать все подряд в try - catch не разумно..  smile 

Цитата(gambit @  4.11.2008,  16:29 Найти цитируемый пост)
, а ошибку может произойти там где меньше всего ее ожидаешь


Это интересно как? Когда вызываешь метод, в котором написано какие исключения он может выбросить и не ожидаешь, что выбросятся исключения?

Я думаю нету смысла оборачивать в try-catch места кода, где идут операции типа Console.WriteLine("любой текст")... 

Ну а
Цитата(Bogdan1024 @  4.11.2008,  16:33 Найти цитируемый пост)
try
            {
                Application.Run(new Form1());
            }


Вообще отжег smile))

А чего не так:

Код

static void Main()
        {
            try
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new UpdaterUI());
            }
            catch (Exception ex)
            {
                try
                {
                    Trace.WriteLine(DateTime.Now + "\tException in program.cs: " + ex);
                }
                catch (Exception innerEx)
                {
                    Trace.WriteLine(DateTime.Now + "\tInner exception in program.cs: " + innerEx);
                }
            }
        }


Это сообщение отредактировал(а) Мурлыкатам_ - 14.11.2008, 20:02


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
PashaPash
Дата 15.11.2008, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 9
Всего: 49



Цитата(Мурлыкатам_ @  14.11.2008,  20:00 Найти цитируемый пост)
Это интересно как? Когда вызываешь метод, в котором написано какие исключения он может выбросить и не ожидаешь, что выбросятся исключения?

В MSDN не перечислены все возможные исключения для методов, только специфические для них. ThreadAbortException, BadImageFormatException, TypeLoadException, OutOfMemoryException и еще н-цать других могут возникнуть в любой момент. Поэтому нужно действовать строго по гайдлайнам - ловить только те исключения, после которых код может восстановиться - продолжить нормальную работу.
Вообще,  исключение - это не ошибка. Это уведомление о том, что какое-то предположение, сделанное разработчиком в момент написания кода, оказалось ложным.  Например, вызов File.Move предполагает что файл существует. Поэтому нельзя "ожидать, что выбросятся исключения". Выбросилось исключение - значит ты уже не ожидал ситуации, которая его вызвала. 


--------------------
PM MAIL WWW   Вверх
Мурлыкатам_
Дата 18.12.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



Цитата(PashaPash @  15.11.2008,  01:49 Найти цитируемый пост)
и еще н-цать других могут возникнуть в любой момент


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

Цитата(PashaPash @  15.11.2008,  01:49 Найти цитируемый пост)
Вообще,  исключение - это не ошибка.


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

Цитата(PashaPash @  15.11.2008,  01:49 Найти цитируемый пост)
Это уведомление о том, что какое-то предположение, сделанное разработчиком в момент написания кода, оказалось ложным


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

Цитата(PashaPash @  15.11.2008,  01:49 Найти цитируемый пост)
Например, вызов File.Move предполагает что файл существует. Поэтому нельзя "ожидать, что выбросятся исключения". Выбросилось исключение - значит ты уже не ожидал ситуации, которая его вызвала.  


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

Вообще исключения и их обработка дорогостоящая и ресурсоёмкая, поэтому ими и нужно пользоваться в ИСКЛЮЧИТЕЛЬНЫХ ситуациях а не оборачивать все приложение в try - catch..

Думаю пора эту тему в песочницу переносить =)))

ЗЫ.
Оберни хоть весь комп в трай - кэч, если возникнет OutOfMemoryException смысл уже удерживать работоспособность приложения?!?!?!

PS.

А если возникнет:  .NET Runtime version 2.0.50727.63 - Fatal Execution Engine Error ??? Сколько не оборачивай траями, все равно прилада сляжет =((( А на траях тока производительность потеряешь! smile

Вообще мне по возможности нравиться подход без исключений. К примеру вместо 

Код

try {
DateTime.Parse() 
} catch (Exception ex) {
// log
}


Использовать так:

Код

if(!DateTime.TryParse()) {
// Log
}


Это сообщение отредактировал(а) Мурлыкатам_ - 18.12.2008, 18:42


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
Partizan
Дата 18.12.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



Мурлыкатам_, 

Цитата

если весь проект - твой и не используются сторонние библиотеки


А .NET считается сторонней библиотекой?  smile 

Цитата

Почему ложным?! Если заготовлена обработка?


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




--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Мурлыкатам_
Дата 18.12.2008, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

Репутация: нет
Всего: 2



Цитата(Partizan @  18.12.2008,  18:43 Найти цитируемый пост)
А .NET считается сторонней библиотекой?  smile 


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

Цитата(Partizan @  18.12.2008,  18:43 Найти цитируемый пост)
Потому-что когда ты вызываешь метод, ты ожидаешь что он отработает нормально...
а вот обработка исключения - это просто небольшая подстраховка от неожиданных ситуаций...


так почему предположение программиста - ложное?!  smile 

Это сообщение отредактировал(а) Мурлыкатам_ - 18.12.2008, 19:13


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
Partizan
Дата 18.12.2008, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



Мурлыкатам_, 

Цитата

так почему предположение программиста - ложное?!


Да потому, что предполагает программист, что метод отработает нормально...
Брошенное  исключение говорит, что "видимо что-то случилось"(с) не помню кто.


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PashaPash
Дата 18.12.2008, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 9
Всего: 49



Цитата(Мурлыкатам_ @  18.12.2008,  18:26 Найти цитируемый пост)
Как это возможно?! Все что ты пишешь, должен ожидать возможную непредвиденную ситуацию (если весь проект - твой и не используются сторонние библиотеки) и обрабатывать ее. Что значит в "любой момент"? Все обработано и записано в лог. В тех местах, где это нужно, а не везде подряд, чтобы авось не вышла какая нибудь исключительная ситуация.. Тут нету авось, это ж как в аптеке smile да - да, нет - нет.

В любой момент - дословно - значит вообще в любой момент. .NET обладает замечательным свойством бросать исключения прямо посреди твоего кода. ThreadAbortException в строчке i++? Да как два пальца smile В примере выше можно ожидать исключения между словами Main и первым try - там есть nop, в отладочной сборке. Ожидать исключения можно вообще в любой момент, но это не значит что каждую строчку надо заворачивать в try/catch. Есть вполне определенные места, где исключения есть смысл ловить - на границе уровней приложения. В документации к Exception Handling Application Block есть очень наглядная картинка. Все остальные try/catch можно почти всегда смело выбросить.
Цитата(Мурлыкатам_ @  18.12.2008,  18:26 Найти цитируемый пост)
Интересное утверждение. Исключение это следствие ошибки программиста в некоторых случаях, а значит косвенно тоже ошибка smile))))))))

Исключение - следствие неидеальности мира smile Скажем, тот же ThreadAbortException в веб-приложении - не ошибка, и при этом код не может и не должен продолжать выполнение. 
Цитата(Мурлыкатам_ @  18.12.2008,  18:26 Найти цитируемый пост)
Не обязательно, ведь есть ожидаемые исключения?! Ты ждешь что возможно получишь исключение, знаешь какое, на всякий случай убеждаешься, что это именно оно, а то еще и предварительно сам его throw делаешь =))) Почему ложным?! Если заготовлена обработка?
Если можно заменить ожидание исключения предварительной проверкой - то нужно это сделать. А если ты сам делаешь throw и сам тут же ловишь это исключение - то налицо явные проблемы с дизайном. Ловить и обрабатывать можно только чужие исключения, в крайнем случае - свои из другого независимого куска.
Цитата(Мурлыкатам_ @  18.12.2008,  18:26 Найти цитируемый пост)
Ну пример не удачный, в случае File.Move можно предугадать все возможные исключения и обработать их.
Ну да, их всего то штук 40 smile И что ты понимаешь под обработать? Восстановиться после ошибки и продолжить нормальное выполнение? Код пытался переместить файл, не смог. Если он после этого может нормально работать, то зачем он перемещал файл? Если не может - то какой смысл обрабатывать исключение? Записать в лог, и спокойно умереть, бросив оригинальное исключение - правильный выбор в 99% случаев. И с этим вполне справляется один глобальный стандартный обработчик на все приложение.

Добавлено через 1 минуту и 39 секунд
Цитата(Мурлыкатам_ @  18.12.2008,  19:00 Найти цитируемый пост)

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

Сегодня вышел GDR к .net 3.5 SP1, исправляющий пару критических ошибок.  .net - это хуже, чем сторонняя библиотека smile


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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