![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| gambit |
|
|||
![]() Эксперт ![]() ![]() ![]() Награды: 1 Профиль Группа: Комодератор Сообщений: 1359 Регистрация: 25.6.2006 Где: я? Репутация: 3 Всего: 40 |
Добрый день. Скажите можно ли реализовать в шарпе такую штуку?
М моем приложении будет журнал событий, в который записываются ошибки и все остальное, в наиболее важных и ключевых местах я естественно ставлю try {}, но каждую строчку не выделишь, а ошибку может произойти там где меньше всего ее ожидаешь. Так вот вопрос: можно ли сделать такую функцию, которая перехватывала бы любой исключение необработанное блоком try? |
|||
|
||||
| Bogdan1024 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1436 Регистрация: 28.9.2005 Где: Киев Репутация: 3 Всего: 13 |
Если у тебя windows-приложение (я предполагаю), то можешь написать в Program.cs:
-------------------- ![]() |
|||
|
||||
| elbjarn |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 98 Регистрация: 13.4.2008 Где: Дубна Репутация: 1 Всего: 3 |
я уже поднимал когда-то такой вопрос на форуме:
http://forum.vingrad.ru/forum/topic-231495.html Рихтер, как справедливо замечено в той теме, не рекомендует так поступать: приложение не должно "проглатывать" все исключения подряд. исключение как раз для того и предназначено, что означает исключительную ситуацию. по-хорошему, каждое исключение нужно отлавливать по-своему, потому что в разных местах логика работы программы (и соответственно логика обработки ошибок) разная. задача "поймать все исключения и по возможности молчаливо продолжить работу" актуальна только в том случае, если вам достался недорелиз, который завтра надо показывать заказчику, а в нем багов немеряно. в остальных ситуациях просто надо ловить ошибки в тех местах, где они могут быть, вот и все |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
AppDomain.UnhandledException Event и остальные методы в его Remarks. Перед использованием прочитать документацию и Exception Handling Guidelines
Добавлено через 3 минуты и 21 секунду ЗЫ elbjarn, работает в .NET Compact Framework ;) |
|||
|
||||
| gambit |
|
|||
![]() Эксперт ![]() ![]() ![]() Награды: 1 Профиль Группа: Комодератор Сообщений: 1359 Регистрация: 25.6.2006 Где: я? Репутация: 3 Всего: 40 |
||||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
PashaPash,
Насколько я знаю, AppDomain.UnhandledException Event не произойдёт, если исключение будет брошено в каком-нить "левом" потоке приложения.... -------------------- СУВ, Partizan. |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Partizan, про левый поток - это Application.ThreadException
|
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
ааа...точно...
-------------------- СУВ, Partizan. |
|||
|
||||
| Мурлыкатам_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 5.2.2007 Где: город-герой Минск Репутация: нет Всего: 2 |
Вообще, по идеи, программист должен знать где у него может возникнуть исключение и реализовать его соответствующую обработку...
Заворачивать все подряд в try - catch не разумно.. Это интересно как? Когда вызываешь метод, в котором написано какие исключения он может выбросить и не ожидаешь, что выбросятся исключения? Я думаю нету смысла оборачивать в try-catch места кода, где идут операции типа Console.WriteLine("любой текст")... Ну а Вообще отжег А чего не так:
Это сообщение отредактировал(а) Мурлыкатам_ - 14.11.2008, 20:02 |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
В MSDN не перечислены все возможные исключения для методов, только специфические для них. ThreadAbortException, BadImageFormatException, TypeLoadException, OutOfMemoryException и еще н-цать других могут возникнуть в любой момент. Поэтому нужно действовать строго по гайдлайнам - ловить только те исключения, после которых код может восстановиться - продолжить нормальную работу. Вообще, исключение - это не ошибка. Это уведомление о том, что какое-то предположение, сделанное разработчиком в момент написания кода, оказалось ложным. Например, вызов File.Move предполагает что файл существует. Поэтому нельзя "ожидать, что выбросятся исключения". Выбросилось исключение - значит ты уже не ожидал ситуации, которая его вызвала. |
|||
|
||||
| Мурлыкатам_ |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 5.2.2007 Где: город-герой Минск Репутация: нет Всего: 2 |
Как это возможно?! Все что ты пишешь, должен ожидать возможную непредвиденную ситуацию (если весь проект - твой и не используются сторонние библиотеки) и обрабатывать ее. Что значит в "любой момент"? Все обработано и записано в лог. В тех местах, где это нужно, а не везде подряд, чтобы авось не вышла какая нибудь исключительная ситуация.. Тут нету авось, это ж как в аптеке Интересное утверждение. Исключение это следствие ошибки программиста в некоторых случаях, а значит косвенно тоже ошибка
Не обязательно, ведь есть ожидаемые исключения?! Ты ждешь что возможно получишь исключение, знаешь какое, на всякий случай убеждаешься, что это именно оно, а то еще и предварительно сам его throw делаешь =))) Почему ложным?! Если заготовлена обработка? Ну пример неудачный, в случае File.Move можно предугадать все возможные исключения и обработать их. Вообще исключения и их обработка дорогостоящая и ресурсоёмкая, поэтому ими и нужно пользоваться в ИСКЛЮЧИТЕЛЬНЫХ ситуациях а не оборачивать все приложение в try - catch.. Думаю пора эту тему в песочницу переносить =))) ЗЫ. Оберни хоть весь комп в трай - кэч, если возникнет OutOfMemoryException смысл уже удерживать работоспособность приложения?!?!?! PS. А если возникнет: .NET Runtime version 2.0.50727.63 - Fatal Execution Engine Error ??? Сколько не оборачивай траями, все равно прилада сляжет =((( А на траях тока производительность потеряешь! Вообще мне по возможности нравиться подход без исключений. К примеру вместо
Использовать так:
Это сообщение отредактировал(а) Мурлыкатам_ - 18.12.2008, 18:42 |
||||||
|
|||||||
| Partizan |
|
||||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
Мурлыкатам_,
А .NET считается сторонней библиотекой?
Потому-что когда ты вызываешь метод, ты ожидаешь что он отработает нормально... а вот обработка исключения - это просто небольшая подстраховка от неожиданных ситуаций... -------------------- СУВ, Partizan. |
||||
|
|||||
| Мурлыкатам_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 265 Регистрация: 5.2.2007 Где: город-герой Минск Репутация: нет Всего: 2 |
Ну к примеру в проекте юзается библиотека SGMLReader для конвертирования хтмл в хмл это ж сторонняя библиотека, и не редки случае когда в сторонних библиотеках происходят проблемы.. так почему предположение программиста - ложное?! Это сообщение отредактировал(а) Мурлыкатам_ - 18.12.2008, 19:13 |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
Мурлыкатам_,
Да потому, что предполагает программист, что метод отработает нормально... Брошенное исключение говорит, что "видимо что-то случилось"(с) не помню кто. -------------------- СУВ, Partizan. |
|||
|
||||
| PashaPash |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
В любой момент - дословно - значит вообще в любой момент. .NET обладает замечательным свойством бросать исключения прямо посреди твоего кода. ThreadAbortException в строчке i++? Да как два пальца
Исключение - следствие неидеальности мира Если можно заменить ожидание исключения предварительной проверкой - то нужно это сделать. А если ты сам делаешь throw и сам тут же ловишь это исключение - то налицо явные проблемы с дизайном. Ловить и обрабатывать можно только чужие исключения, в крайнем случае - свои из другого независимого куска.
Добавлено через 1 минуту и 39 секунд Сегодня вышел GDR к .net 3.5 SP1, исправляющий пару критических ошибок. .net - это хуже, чем сторонняя библиотека |
||||
|
|||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |