Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка исключения, после обработки Access violation 
:(
    Опции темы
knopka
Дата 26.9.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Запрашиваю данные, если таких данных нет то возникает исключение
EVariantTypeCastError так как неможет конвертировать NULL в int (MyColor целое)
try { myColor= fmFullHistory->SQLClientDataSet1->FieldByName("Color")->Value;  }
   catch(...) {   fmFullHistory->SQLClientDataSet1->Active=false; myColor = 5;...
обрабатываю вывожу на экран сообщение об отсутствии данных закрываю окно 
сообщения и вываливается ошибка Access violation at address ....
PM MAIL ICQ   Вверх
pam
Дата 26.9.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Запускаешь из Билдера? Он, кобель злостный, у меня все ошибки перехватывает до программы. Попробуй запустить екзешник отдельно - не из Билдера... smile
PM MAIL   Вверх
Kuvaldis
Дата 26.9.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



Tools\Debugger options. Вкладки exceptions  smile 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
knopka
Дата 27.9.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Что-то всё в Tools\Debugger пощёлкал непомагает, как я понимаю это всё может влиять в процессе отладки а не готового exeшника
PM MAIL ICQ   Вверх
Vyacheslav
Дата 27.9.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну так в дебагере определите, где у Вас ошибка генрится. Судя по симптомам
" Access violation at address" никакого отношения к EVariantTypeCastError не имеет
Весь код, который у Вас catch предоставте, пожалуйста


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


Бывалый
*


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

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



int myColor;
try 
   { myColor= fmFullHistory->SQLClientDataSet1->FieldByName("Color")->Value;  }
catch(...) 
   {  
         fmFullHistory->SQLClientDataSet1->Active=false;
         myColor = 5; // если нет событий обрабатываем ситуацию
         MessageBox(NULL,NULL,"Запрашиваемых событий нет",MB_OK);
    }
как только кликнул Ок на сообщении "Запрашиваемых событий нет" так ошибка сразу вываливается
если же события есть то всё проходит как по маслу. Уже думал может myColor сделать AnsiString
тогда и обрабатывать исключение не надо будет? 
PM MAIL ICQ   Вверх
dumb
Дата 27.9.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



ошибка происходит не в этом куске, а после. возможно из-за закрытия dataset'a. научись пользоваться встроенным отладчиком.
PM MAIL   Вверх
Vyacheslav
Дата 27.9.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Да, похоже строка, генерирующая ошибку, расположена вне этого кода


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


Бывалый
*


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

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



to dumb: если не закрываю набор всё вообще виснет
PM MAIL ICQ   Вверх
Vyacheslav
Дата 28.9.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Дайте код который у Вас следует за этим куском. Вы дебагере по шагам прошлись? Какую строчку показывает дебагер?



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


Бывалый
*


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

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



Код

      void __fastcall TfmFullHistoryReport::DBGrid1DrawColumnCell(
      TObject *Sender, const TRect &Rect, int DataCol, TColumn *Column,
      TGridDrawState State)
{   int myColor;
     TColor MyGreen=TColor(RGB(160,220,160));  // определяем свой зелёный цвет
     TColor MyRed=TColor(RGB(250,170,190));    // определяем свой красный цвет
     TColor MyGrey=TColor(RGB(210,210,210));   // определяем свой серый цвет
     try { myColor= fmFullHistory->SQLClientDataSet1->FieldByName("Color")->Value;  }
     catch(...) {   fmFullHistory->SQLClientDataSet1->Active=false;
                 myColor = 5; // если нет событий обрабатываем ситуацию
                 MessageBox(NULL,NULL,"Запрашиваемых событий нет",MB_OK);
               }     // EvariantTypeCastError
switch (myColor)
    {
      case 0 :  DBGrid1->Canvas->Brush->Color=MyGrey   ;break;   
      case 1 :  DBGrid1->Canvas->Brush->Color=MyGreen  ;break; 
      case 2 :  DBGrid1->Canvas->Brush->Color=MyRed    ;break;  
      case 3 :  DBGrid1->Canvas->Brush->Color=clWhite  ;break;  

      default    :  ;break;   
    }
    DBGrid1->Canvas->FillRect(Rect);
    DBGrid1->Canvas->TextOut(Rect.Left+2,Rect.Top+2,Column->Field->Text);
}



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

myColor= fmFullHistory->SQLClientDataSet1->FieldByName("Color")->Value;
 если DataSet в результате запроса пуст то конвертировать NULL в int он неможет вот это исключение и обрабатывается. А в готовом EXEшнике после окна "Запрашиваемых событий нет" сразу 
вываливается  Access violation at address ...
PM MAIL ICQ   Вверх
knopka
Дата 28.9.2006, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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


Эксперт
****


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

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



Вы ловите exception и о нем можете забыть.
У Вас генерится где то другой. Я не понимаю, почему бы Вам вместо того, чтобы гадать, проссто не пройтись по шагам и выяснить где именно генерится второй эксепшен. 
То что, в готовом приложении эксепшион вываливается сразу после окна, ничего не значит. К чему например, прикучен у Вас DBGrid? В конце концов, нафига дожидаться первого эксешен. Не проще выполнить следующий код
Код

myColor  = (fmFullHistory->SQLClientDataSet1->Active && !fmFullHistory->SQLClientDataSet1->IsEmpty())?fmFullHistory->SQLClientDataSet1->FieldByName("Color")->AsInteger:5;
}





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


Бывалый
*


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

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



to Vyacheslav 
Большое Вам спасибо за толчок в нужном направлении
сделал так:
 
Код

if ( fmFullHistory->SQLClientDataSet1->Active && !fmFullHistory->SQLClientDataSet1->IsEmpty())
                   {  myColor= fmFullHistory->SQLClientDataSet1->FieldByName("Color")->Value;
                     switch (myColor)
                     {
                     case 0: {  DBGr........

Всё работает.  Ошибок нет. Спасибо.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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