| VainahskiyPapa | 
|  Отправлено: 06.10.2003, 08:40 |  | 
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 46
 
 
 
  
 | Здравствуйте. У меня проблема с отлавливанием исключений исходящих от Excel и ячеек excel.
 Раньше я работал с Java и там для того чтобы отловить неизвестное исключение достаточно использовать суперкласс всех исключений или extends Exception для своего класса.
 А как использовать тоже самое в С++ я смотрел Дейтела. Так вот там вообще непонятно зачем вообще исключения в с++ ведь все равно самому надо все обрабатывать. А если не знаешь какую ошибку обрабатывать. Там написано что если со средой связано можно использовать саtch(...) но у меня это не действует. Подскажите пожалуйста.
 
 try {
 cur = Sh.OlePropertyGet("Cells",Row,Column);
 result = (AnsiString) cur.OlePropertyGet("Value");
 } catch(...) {}
 
 | 
|  | 
| Asher | 
| Отправлено: 06.10.2003, 09:52 |  | 
|  
 Мастер участка
 
 Группа: Модератор
 Сообщений: 550
 
 
 
  
 | неплохо бы в catch(...) {} написать что-нибудь в фигурных скобках, чтобы проконтролировать вхождение (типа OutputDebugString("Упс!")  . и проверить галочки в чекбоксах Tools->Debugger Options->Language Exception->Stop on Delphi Exception и Stop on C++ Exception
 | 
|  | 
| Guest | 
| Отправлено: 06.10.2003, 10:07 |  | 
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Все поставил, но ошибка все равно появляется. Дело в том что я не знаю (до тех пор пока пользователь не введет) как расположены поля вертикально или горизонтально. И если пользователь введет горизонтально — а на самом деле будет верикально и я буду читать выходя за границы ячеек где существуют данные то будет ошибка Access Violation и ее то как раз и надо отловить. Вот. Галочки везде стоят. | 
|  | 
| Vainahskiy Papa | 
| Отправлено: 06.10.2003, 10:07 |  | 
| 
 Не зарегистрирован
 
 
 
 
 
 
 
  
 | Все поставил, но ошибка все равно появляется. Дело в том что я не знаю (до тех пор пока пользователь не введет) как расположены поля вертикально или горизонтально. И если пользователь введет горизонтально — а на самом деле будет верикально и я буду читать выходя за границы ячеек где существуют данные то будет ошибка Access Violation и ее то как раз и надо отловить. Вот. Галочки везде стоят. | 
|  | 
| Asher | 
| Отправлено: 06.10.2003, 11:58 |  | 
|  
 Мастер участка
 
 Группа: Модератор
 Сообщений: 550
 
 
 
  
 | Я что-то не совсем понял...  Ошибка возникает. Ловится? Если в блок catch попадает, то все нормально ловится. Сообщение появляться и должно, чтобы программер сам видел, что проблема есть
 А при релизной компиляции галки убрать...
   | 
|  | 
| VainahskiyPapa | 
| Отправлено: 06.10.2003, 12:05 |  | 
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 46
 
 
 
  
 | AAAA tipa esli uje gotoviy produkt to galki ubrat` to v gotovoi versii isklucheniya tipa Access violation viskakivat` ne budut? Soobshenie vse eshe vihodit. Ya proboval na chistom C++ pisat:
 
 int a=0,b=8,c;
 
 try{
 c=b/a;
 cout<
}catch(...) {cout<<"Error Div By Zero";}
 
 POSle chego nifiga ne otlavlivaetsya i vihodit obichnoe soobshenie Win ob oshibke Div By Zero esli ya napishu na Javke catch(Exception e) {...} vse poimaet. Kak toje samoe na C++? Napishite pojaluista.
 
 Отредактировано VainahskiyPapa — 06/10/2003, 13:08
 | 
|  | 
| Георгий | 
| Отправлено: 06.10.2003, 18:26 |  | 
| 
 Почетный железнодорожник
 
 Группа: Модератор
 Сообщений: 874
 
 
 
  
 | Исключения прекрасно работают. 
 | CODE |  | int a=0,b=8,c; try     {
 c=b/a;
 //throw ( b );
 }
 catch(EDivByZero& e)
 {
 Application->MessageBox("Error Div By Zero","Error",MB_OK);
 }
 catch(Exception& e)
 {
 Application->MessageBox("Unknown BCB Exception","Error",MB_OK);
 }
 catch(...)
 {
 Application->MessageBox("Unknown C++ Exception","Error",MB_OK);
 };
 | 
 Попробуйте запустить один exe (вне BCB) и убедитесь, что окошко с текстом "Error Div By Zero" появляется как должно.
 
 А насчёт галок — ты не правильно это понял.
 
 PS. у всех объектов исключений в BCB базовый класс Exception, но никто не мешает тебе написать
 
 | CODE |  | int c=666;
 throw( c );
 
 | 
 Т.е. в качестве объекта исключения может быть любой объект — в том числе и int.
 | 
|  | 
| VainahskiyPapa | 
| Отправлено: 13.10.2003, 08:48 |  | 
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 46
 
 
 
  
 | Spasibo vam. U menya eshe odin vopros. Kogda ya pishu naprimer v chistom C++: d=0;
 try{
 a=b/d;
 cout<
 }catch(Exception& e) {printf(e);}
 
 I govorit Type name expected in func main();
 Catch statement missing in func main — o je samoe dlya EDivByZero
 
 esli postavlyu catch(...) — rabotayet no DivByZero ne otlavlivaet — eto ved ne sys error.
 
 to C++ pochemuto ne lovit iskluchenie i oshibka Run-time div by zero.
 Ili eto zavisit ot versii kompilyatora? K stati v Lippmane ne napisono chto mojno std lib ispol`zovat` dlya isklucheniy. Otvet`te pojaluysta.
 
 Отредактировано VainahskiyPapa — 13/10/2003, 10:04
 | 
|  | 
| Георгий | 
| Отправлено: 13.10.2003, 09:40 |  | 
| 
 Почетный железнодорожник
 
 Группа: Модератор
 Сообщений: 874
 
 
 
  
 | В чистом C++ нет базового класса для исключений, как впрочем и любых других стандартных объектов исключений (хотя... как то странно это — наверное хоть какие то стандартные исключения есть) — объектом исключений может являться абсолютно любой класс в том числе и stl (не проверял, но самодельные классы как обьекты исключений нормально работают). 
 А когда ты в чистом C++ пишешь catch(Exception&), то компилятор не находит прототипа класса Exception и какую то глупость пишет.
 
 Надо посмотреть описание компилятора и мат. библиотек на тему какое исключение генерируется, когда делится на ноль, но скорее всего придётся тебе использовать catch(...).
 
 Кстати — у тебя раньше вроде получалось писать по русски, а сайчас один транслит...
 | 
|  | 
| VainahskiyPapa | 
|  Отправлено: 13.10.2003, 12:36 |  | 
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 46
 
 
 
  
 | Ясно. Спасибо. К стати с catch(...) работать ничего не должно так-как эта форма используется для системных ошибок насколько я знаю. Теперь буду стараться кирилицей   | 
|  | 
| Георгий | 
| Отправлено: 13.10.2003, 16:57 |  | 
| 
 Почетный железнодорожник
 
 Группа: Модератор
 Сообщений: 874
 
 
 
  
 | а мне кажется, что catch(...) используется для обработки всех не обработанных исключений в пределах соответствующего try. 
 Проверялось в Watcom C++ 10.6 и в BCB5pro. Вроде даже в bc3.1 работало, но это было давно и на счёт bc3.1 могу ошибаться.
 | 
|  | 
| VainahskiyPapa | 
|  Отправлено: 14.10.2003, 08:03 |  | 
| 
 Дежурный стрелочник
 
 Группа: Участник
 Сообщений: 46
 
 
 
  
 | Да вы правы. Почитал. Действительно любых. Но почему-то у меня не любых. Наверное я тормоз  Шутка. | 
|  |