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
|
Да вы правы. Почитал. Действительно любых. Но почему-то у меня не любых. Наверное я тормоз Шутка. |
|