![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| amarenkov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
Добрый день.
Есть класс, который что-то пишет себе в List<String>. Каждый раз, когда лист разрастается до n элементов его содержимое пишется на диск и список очищается. Когда приложение закрывается у класса вызывается метод, который сбрасывает список на диск, даже если он не достиг n элементов. Вопрос: можно ли как-то сделать, чтобы даже при необрабатываемом эксепшене (которое рушит приложение и показывается уже в ОС), этот класс сохранял свой список на диск? P.S. Не хочется, чтобы класс привязывался к каким-либо событиям типа Application.ThreadException Заранее спасибо. |
|||
|
||||
| Walker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 23.10.2006 Репутация: 5 Всего: 16 |
Доброго времени суток!
Насколько я понимаю Ваш вопрос, он полностью упирается в проектирование приложения. "Необрабатываемый экспешн" - это непредусмотрительность разработчика. Система ловит только то, с чем приложение справится оказалось не в состоянии. При правильном использовании обработки исключений код сохранения помещают в блок finally конструкции try - cacth - finally. Так Вы обращайтесь с исключениями, которые могут выбросить модули в ваше приложение. Защищайте свои внутренние структуры. А уж как распорядится со списком класс, при вызванном исключении во время его выполнения зависит полностью от религии его разработчиков. Удачи! -------------------- "От вчерашних побед остаётся усталость, если завтрашний день не сулит ничего..." |
|||
|
||||
| amarenkov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
Тут подразумевается, что этот класс может использоваться кем-то другим, не мной. И я не могу гарантировать, что тем человеком будет правильно спроектировано приложение. Я хочу быть уверенным, что в случае, если произойдет необрабатываемый эксепшн вне моего класса, мой класс сможет сохранить свое содержимое на диск. Это возможно
|
|||
|
||||
| Walker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 23.10.2006 Репутация: 5 Всего: 16 |
Ключевая фраза
"Разделяй и властвуй". Оберегайте свои внутренние структуры и боритесь с тем, что может случится в Вашем классе. Не делайте никаких предположений относительно его использования. Никакое ясновидение не поможет. Следить за внешним приложением Вы всё равно никакого права не имеете. Ваше минимальная задача - сохранить данные и сообщить об Exception, случившемся у Вас. А если у него не хватит мозгов обработать документированное исключение, или его приложение падёт вообще в другом месте, то это абсолютно его собачье дело. Это сообщение отредактировал(а) Walker - 28.4.2008, 09:40 -------------------- "От вчерашних побед остаётся усталость, если завтрашний день не сулит ничего..." |
|||
|
||||
| amarenkov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
вот это ключевая фраза У себя-то я обрабатываю все исключения и т.п. Но, когда у него произойдет исключение, мой класс должен все-равно сохранить свои данные на диск. Это возможно или нет? Можно ли это сделать через финализатор? Или еще как? P.S. (вопрос не совсем в тему) Что вообще происходит с объектами в момент "вылета" приложения? Убирает ли их GC? Это сообщение отредактировал(а) amarenkov - 28.4.2008, 09:53 |
|||
|
||||
| Walker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 23.10.2006 Репутация: 5 Всего: 16 |
Ну, как хотите.
Я считаю, что отказоустойчивость на уровне класса - излишество. Система тоже может уйти в синий экран. Сбрасывайте свои дампы периодически в temp-файлы. Может кто ещё чего посоветует. Удачи! ЗЫ! Убирает. Но не GC, а среда исполнения. -------------------- "От вчерашних побед остаётся усталость, если завтрашний день не сулит ничего..." |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Подписываемся на событие AppDomain.CurrentDomain.UnhandledException.
-------------------- ![]() |
|||
|
||||
| amarenkov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
Walker, спасибо
Я как раз и сбрасываю свою информацию периодически в файл. Но когда возникнет такое исключение, весьма вероятно, что в моем файле останется информация, которую еще не сбросил в файл. А очень хочется все-таки сбросить... Добавлено через 24 секунды mr.DUDA, а без этого никак |
|||
|
||||
| Walker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 363 Регистрация: 23.10.2006 Репутация: 5 Всего: 16 |
Сбрасывайте её непосредственно перед модификацией. Изменения вносите только при условии удачного окончания операции вывода. Тогда вас сломает только многопроцессорность.
-------------------- "От вчерашних побед остаётся усталость, если завтрашний день не сулит ничего..." |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
amarenkov, если код "вылетит" без обработки try..catch, событие UnhandledException сгенерируется в любом случае (кроме StackOverflowException и исключений ThreadPool, о них разговор особый). Вроде это и нужно было?
-------------------- ![]() |
|||
|
||||
| amarenkov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
mr.DUDA , спасибо, это подойдет. Просто было интересно, возможны ли еще решения
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Можно то же самое сделать на событии Application.ThreadException
-------------------- ![]() |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [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. |