Поиск:

Ответ в темуСоздание новой темы Создание опроса
> странный вылет программы 
:(
    Опции темы
Anikmar
Дата 16.1.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 34
Всего: 59



Да ладно нападать на Архангельского. Не одна сотня программистов по его книгам начинала. Хотя конечно указанный прокол достаточно серьезный, но в общем понимании его книги очень и очень полезны.
PM MAIL ICQ   Вверх
Vyacheslav
Дата 16.1.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(Anikmar @  16.1.2007,  15:03 Найти цитируемый пост)
 Не одна сотня программистов по его книгам начинала.

Вот-вот. А я то думаю, и чего это 50% кандидатов при собеседовании чуть до мигрени меня не доводят, убеждая, что new просто объязан возвращать NULL.  smile



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Anikmar
Дата 16.1.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 34
Всего: 59



Vyacheslav, я не думаю, что это должен быть основной критерий отбора. Даже если кандидат в этом ошибается, это вовсе не значит, что он и в остальном полный 0.
Люди они разные, а программисты тем более  smile 
PM MAIL ICQ   Вверх
Vyacheslav
Дата 16.1.2007, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(Anikmar @  16.1.2007,  15:16 Найти цитируемый пост)
Даже если кандидат в этом ошибается, это вовсе не значит, что он и в остальном полный 0.

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




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Anikmar
Дата 16.1.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 34
Всего: 59



Цитата(Vyacheslav @  16.1.2007,  15:36 Найти цитируемый пост)
Это означает, что человек  вообще не писал серьезных приложений


К стыду своему признаюсь, что я почти нигде не перехватыфваю это исключение. Если не сработал new - происходит отработка на уровне Application - т.к. в 99% случаев это говорит о том, что дальше работать нельзя. За исключением соучаев, когда в какой-нибудь ветке требуются уж очень большие ресурсы, на которые реально может нехватить памяти.

Если вылетает new с объектом размером 100 байт - значит где-то очень серьезная утечка. А заключать каждый new в блок try catch приведет уж к больно большому разрастанию кода.

Правда я себя не считаю профессионалом - скорее плотный любитель.
PM MAIL ICQ   Вверх
Vyacheslav
Дата 16.1.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(Anikmar @  16.1.2007,  15:43 Найти цитируемый пост)
К стыду своему признаюсь, что я почти нигде не перехватыфваю это исключение. Если не сработал new - происходит отработка на уровне Application - т.к. в 99% случаев это говорит о том, что дальше работать нельзя.

Угу. Потому что за Вас это делает VCL 

Код

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    {
         Application->Initialize();
         Application->CreateForm(__classid(TForm1), &Form1);
         Application->Run();
    }
    catch (Exception &exception)
    {
         Application->ShowException(&exception);
    }
    catch (...)
    {
         try
         {
             throw Exception("");
         }
         catch (Exception &exception)
         {
             Application->ShowException(&exception);
         }
    }
    return 0;
}
/


Цитата(Anikmar @  16.1.2007,  15:43 Найти цитируемый пост)
 заключать каждый new в блок try catch приведет уж к больно большому разрастанию кода.

Заключать каждый new в блок try catсh - обратная сторона той же некомпетентности. 
См предыдущий мой пост. Ловить нужно по возможности( подчеркиваю - по возможности) как можно дальше от того места, где исключение  произошло. Но ловить обязательно. Вам ведь не не нравится, когда  Windows выходит на синий экран. Так и  с  программой. Сработала или не сработала правильно программа, но в 95 процентах пользователь должен решать, хочет или нет он прекратить с ней работу. А для этого нужно очень аккуратно работать с исключениями   



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Anikmar
Дата 16.1.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 34
Всего: 59



Цитата(Vyacheslav @  16.1.2007,  16:07 Найти цитируемый пост)
Сработала или не сработала правильно программа, но в 95 процентах пользователь должен решать, хочет или нет он прекратить с ней работу.


Согласен с этим на 100%

Но после этого обсуждения я начинаю себя ощущать менее компетентным   smile  

Хотя максимум усилий я прилагаю к повышению дуракоустойчивости программы, и уж конечно, указанный блок в функции Winmain у меня переделан и выдает сообщение по-русски.
PM MAIL ICQ   Вверх
Bima
Дата 16.1.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Vyacheslav, я пытался разобрать ваш пример по "полочкам", не вышло. Скорее всего знаний не хватает, или данных.
Вы не могли бы сделать простой пример (там ловятся централизовано исключения), где скажем так, выделяется память, математические операции(сложение делние без проверки на 0) и что нибудь еще. По возможности с коментариями и выложить этот пример здесь, на всеобщее обучение.
Чем проще пример будет, тем легче его будет понять.

Я всегда ловил исключения только "местно", но это пошло еще с программ DOS-их. Сейчас хочу отойти от этой привычки (можно сказать, вы убедили меня в этом).

P.S. кстати ВСВ тоже учил по Архангельскому, потому, что на тот момент, эта была единственная книжка, которую я нашел (инета небыло).


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Anikmar
Дата 16.1.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 34
Всего: 59



Выскажу еще свое мнение по поводу централизованного перехвата исключений.

В большинстве своем они нужны для отладки и для корректного сохранения данных. Ну ни как пользователю не поможет сообщение хоть по-русски хоть по-французски "Произошло деление на 0. Приложение будет закрыто".

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

Хотя VCL страдает избыточной любовью к исключениям, взять функции типа atoi - зачем генерить исключения в них лично мне не понятно, и там, естественно появляется обработчик с идиотской надписью"Вы ввели не число. Введите, пожалуйста число!"


PM MAIL ICQ   Вверх
Vyacheslav
Дата 16.1.2007, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(Anikmar @  16.1.2007,  16:53 Найти цитируемый пост)
В большинстве своем они нужны для отладки и для корректного сохранения данных. Ну ни как пользователю не поможет сообщение хоть по-русски хоть по-французски "Произошло деление на 0. Приложение будет закрыто".

Угу. Человек работал со складом. Не вышло. Он сообшил об ошибке администратору и чтобы продолжить работу с други модулем этой же программы, получает сообщение "Приложение будет закрыто"
Еще раз. У Вас Windows наверняка иногда выдает ошибки.  И что после этого оно перегружается?



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Anikmar
Дата 16.1.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 34
Всего: 59



Цитата(Anikmar @  16.1.2007,  16:53 Найти цитируемый пост)
Перехватывать исключения нужно обязательно, но желательно в тех местах, откуда по возможности можно продолжить исполнение кода, пусть и с урезанным функционалом, типа "Извините, в программе произошла ошибка, данная функция недоступна, сообщите разработчику".

Именно про такие случаи я и писал. Максимально сохранить возможность продолжать работу. Что зачастую невозможно при очень далеких перехватах исключения. Чем дальше тем лучше, конечно, но и перегибать не надо.
PM MAIL ICQ   Вверх
Vyacheslav
Дата 16.1.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(Anikmar @  16.1.2007,  16:53 Найти цитируемый пост)
взять функции типа atoi - зачем генерить исключения в них лично мне не понятно, и там, естественно появляется обработчик с идиотской надписью"Вы ввели не число. Введите, пожалуйста число!"

Почему с идиотской? Вот давайте на примере и посмотрим как я это сообщение обработаю, невзирая где в программе он располжено и как Вы допустим будете обрабатывать ваш беспроблемный atoi
Вот простейший пример.
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //ошибка кодирования  
  try {
        int temp = AnsiString("ddddd").ToInt();
    } catch(Exception* exp)
    {
        throw Exception(exp->Message);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ApplicationEvents1Exception(TObject *Sender,
      Exception *E)
{
       if (dynamic_cast< EConvertError* >(E)) {
            ShowMessage("Ошибка конвертации. Вы неправильно ввели число. Повторите ввод");
       return;
       }
       if (Application->MessageBox(Format("Программа выполнила недопустимую операцию: %s  в файле : %s в строке :%s"
                                      "Завершить программу?", ARRAYOFCONST(( E->Message, String(__throwFileName), String(__throwLineNumber) ))).c_str(),
                                      "Ошибка", MB_YESNO ) == IDYES    ) {
       Close();
       }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//ошибка ввода 
int temp1 = Edit1->Text.ToInt();
 int temp2 = Edit3->Text.ToInt();
}
//---------------------------------------------------------------------------


Прошу обратить внимание на следующий факт. Там где ошибка связана с неправаильным вводом(Button2Click), будет выдано сообщение. Причем абсолютно неважно, где был выброшено исключение. В данном пример две строчки в Button2Click . А их может быть 100, но программа поведет себя одинаково.
А вот в Button1Click предположим  эта же ошибка  конвертации тоже возможна, но связана она не с вводом, а ошибкой в коде.  Что я , как программист предпринимаю?  Зная, что все причины , вызывающие исключения в этом коде не могут быть исправлены действиями пользователя, я их перехватываю и дальше посылаю свое. Программа поведет себя по другому. Она выведет ошибку , причем с именем файла и строки, где произошло исключение и спросит нужно ли завершить программу. Здесь, конечно, все немного утрировано, но смысл , я надеюсь, понятен.

Добавлено @ 17:52 
Цитата(Anikmar @  16.1.2007,  17:04 Найти цитируемый пост)
Что зачастую невозможно при очень далеких перехватах исключения. 

Ошибаетесь. Как раз возможно smile
В моем предыдущем примере поставте сколько угодно кнопок, в из обработчиках сгенерите исключения и давите как Вам вздумается. Уверяю Вас, программа завершится только с Вашего разрешения. Причем, что удивительно, я  каждое исключение не обрабатываю


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Anikmar
Дата 16.1.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 34
Всего: 59



Убедили. 
Я же и говорю, что я скорее любитель, чем профессионал - программирование занимаюсь в свободное от основной работы время.
Я делаю немного по-другому...
Обычно перехватчик таких исключению у меня немного ниже - на уровне главной формы, но в общем наши действия схожи. Ваш метод мне нравится больше.

Век живи - век учись.


PM MAIL ICQ   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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