Название: Исключения - как правильно готовить? Отправлено: Dmitry_Panoff от Февраль 28, 2006, 11:22 Qt-4.1, gcc-3.4.2 (mingw-special), win2003 enterprise
Имеем объявление и реализацию класса А в файле 1.h и 1.cpp соответственно: Код:
Код:
main.cpp Код:
при запуске винда выдает сообщение: Цитировать This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information Получается, что любое выкидываемое функцией исключение компилятор понимает как неожиданное и вызывает дефолтный виндовый обработчик, который и пишет мне вот такие сообщения. Указывал throw(xClass) в определении и реализации класса, объявлял класс без throw() вообще - все едино. Вопрос: как указать компилятору, что на данное исключение есть свой обработчик и не надо аварийно выкидывать прогу? Название: Re: Исключения - как правильно готовить? Отправлено: kolobok0 от Февраль 28, 2006, 19:03 вот цитата из МСДН...
Код:
надеюсь ситуёвина прояснилась ? с уважением (круглый) Название: Исключения - как правильно готовить? Отправлено: Dmitry_Panoff от Февраль 28, 2006, 22:02 kolobok0
Цитировать надеюсь ситуёвина прояснилась ? Ммм, не совсем... Может я чего-то недопонимаю, но: 1. Я использую gcc, а не компилятор из вижуала. 2. Я написал, что явно прописывал какое исключение функция может выкидывать - все равно вызывается стандартный обработчик... Может при сборке гцц дополнительные ключи надо указывать? Название: Исключения - как правильно готовить? Отправлено: kolobok0 от Март 01, 2006, 14:19 чтоб компилятор не сыпал вонингами и вызывался бы Ваш обработчик попробуйте следующие варианты...
1) не указывать у функции исключения.. 2) обьявить у функции любые типы исключений... и то и то дышит... с уважением (круглый) ЗЫ Если коды ошибок совпадают, и по идентификатору и по смыслу - то думаю особенной рояли не играет, чем Вы пользуетесь при компиляции. Название: Исключения - как правильно готовить? Отправлено: Вудруф от Март 02, 2006, 11:33 Не указывать классы исключений, которые будут генерироваться - плохой тон. В то же время генерация исключений внутри функции, которая объявлена как не генерирующая их - ошибка. И обрабатывается она правильно.
Не понятно, почему при объявлении конкретного класса или вообще без throw() не работает. Сейчас проверю. добавлено спустя 55 минут: Работает... --------------------- a.h: --------------------- #ifndef A_H #define A_H class A { public: class xClass {}; void f1() throw (xClass); }; #endif --------------------- a.cpp: --------------------- #include "a.h" void A::f1() throw (A::xClass) { throw xClass(); } --------------------- main.cpp: --------------------- #include <iostream> #include "a.h" int main() { A aClass; try { aClass.f1(); } catch (const A::xClass &) { std::cout << "OK\n"; } catch (...) { std::cerr << "ERROR\n"; } } добавлено спустя 1 минуту: Выводит "ОК" Название: Исключения - как правильно готовить? Отправлено: Dmitry_Panoff от Март 04, 2006, 21:37 Посидев и покопавшись в доках, поигравшись с простыми примерам по типу приведенного Вудруфом, я выяснил следующее: в gcc для поддержки исключений надо указывать флаги -fexception -frtti. Они правда в мэйкфайле и прописывались, вместе с указанием Qt использовать исключения (CONFIG += exceptions). Но все это ни к чему не привело - указывай тип исключения, прописывай просто ключевое слово throw() или не прописывай вообще ничего - результат один - стандартный виндовый обработчик.
Посему, пришлось мне отказаться от исключений. Это, правда, нескоько загромождает код, но что делать... Из-за чего возникает сей глюк: Qt, mingw, винда, мое недопонимание - мне выяснять недосуг... В общем, отрицательный результат - тоже результат. Всем большое спасибо за помощь. Название: Исключения - как правильно готовить? Отправлено: Вудруф от Март 06, 2006, 07:51 Я использовал прерывания в Qt-программах под Windows, компилируя всё это MinGW. Всё работало...
Единственный вариант, который я могу придумать - исключение не ловится, или по-другому, функция, генерирующая исключение, вызывается не из блока try..., или catch пытается ловить другой тип исключения, нежели ты генерируешь. |