C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Проблема с try{}catch(...);, Ячейки excel
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("Упс!")wink.gif.
и проверить галочки в чекбоксах 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



Я что-то не совсем понял... sad.gif
Ошибка возникает. Ловится? Если в блок catch попадает, то все нормально ловится. Сообщение появляться и должно, чтобы программер сам видел, что проблема есть
А при релизной компиляции галки убрать... cool.gif
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(...) работать ничего не должно так-как эта форма используется для системных ошибок насколько я знаю. Теперь буду стараться кирилицей smile.gif
Георгий
Отправлено: 13.10.2003, 16:57


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



а мне кажется, что catch(...) используется для обработки всех не обработанных исключений в пределах соответствующего try.

Проверялось в Watcom C++ 10.6 и в BCB5pro. Вроде даже в bc3.1 работало, но это было давно и на счёт bc3.1 могу ошибаться.
VainahskiyPapa
  Отправлено: 14.10.2003, 08:03


Дежурный стрелочник

Группа: Участник
Сообщений: 46



Да вы правы. Почитал. Действительно любых. Но почему-то у меня не любых. Наверное я тормоз smile.gif Шутка.

Вернуться в Вопросы программирования в C++Builder