Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Dark Byte
-68 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
#1

Как создавать информативные исключения? - C++

18.11.2014, 22:36. Просмотров 616. Ответов 18
Метки нет (Все метки)

как создавать информативные исключения??? нигде не могу найти внятного объяснения единственный способ какой я знаю throw std::exception("Exception!"), но он не информативен абсолютно, почему то это сообщение которое там пишешь нигде не показывает... что при отладке если на это исключение набредешь просто ошибка типа "Необработанное исключение по адресу ...", что при запуске экзешника "abort() has been called" и все как правильно делать???

з.ы. вот например если в std::string вылезть за диапазон то сразу выкидывается такая большая табличка с надписью "Expression: string subscript out of range" вот как то так бы хоть если бы можно было выкидывать...
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 22:36     Как создавать информативные исключения?
Посмотрите здесь:

Как генерировать исключения? - C++
Как сгенерировать исключение. Как выход индекса за пределы допустимого диапозона. Изучаю API

Как свиртуализировать исключения? - C++
Мне очень нравится как реализован перехват исключений в Python и Java: там в блоке catch не надо перечислять все виды исключений, а...

Как создавать массивы объектов, и как к ним обращаться? - C++
как создавать массивы объектов и как к ним обращаться? вот что пишет создатель самого си в своей книге - получается что нельзя...

Как правильно вызывать исключения? - C++
как правильно вызывать исключения? я вот пишу например так: throw std::exception("Error!"); исключение то выбрасывается, но сообщение...

Как бросать эти исключения? - C++
throw popOnEmpty();, throw pushOnFull(Value);. Что нибудь надо выше заинкладить/написать? Что именно?

Как создавать классы - C++
объясните, пожалуйста, как создавать классы? я уже столько всего прочитал, но ничего не понял!(

Как создавать циклы? - C++
#inklude<iostream> using namescape std; int main() { ??????????????? }

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
18.11.2014, 22:41     Как создавать информативные исключения? #2
Ты их отлавливай при помощи try {} catch {}, они для этого же.
Dark Byte
-68 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
18.11.2014, 22:42  [ТС]     Как создавать информативные исключения? #3
Цитата Сообщение от true_bugmaker Посмотреть сообщение
Ты их отлавливай при помощи try {} catch {}, они для этого же.
причем тут отлов мне надо само возбуждение исключений...
true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
18.11.2014, 22:52     Как создавать информативные исключения? #4
Притом что они не для возбуждения, а для обработки нестандартных ситуаций самой программой. Если нужна информативность, выводи сообщение в stderr и вызывай _exit(), а не пытайся употреблять исключения противоестественным способом. Здесь пример использования исключения, как раз в смысле информативности: http://www.cplusplus.com/reference/exception/exception/
Dark Byte
-68 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
18.11.2014, 22:59  [ТС]     Как создавать информативные исключения? #5
true_bugmaker, так я же и сам знаю где у меня будет исключение... я просто по if это определяю... что мне cerr этот, он только для консольных программ, да и вообще это не то, я хочу чтоб прям брякалась программа на этом исключении и выкидывала табличку с информацией об ошибке (т.е. в любом приложении, вне зависимости от того консольное оно или нет)
Dark Byte
-68 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
18.11.2014, 23:09  [ТС]     Как создавать информативные исключения? #6
вот что я имею ввиду, как вывести табличку по типу этой?
Миниатюры
Как создавать информативные исключения?  
mss307
118 / 118 / 25
Регистрация: 14.12.2013
Сообщений: 352
18.11.2014, 23:10     Как создавать информативные исключения? #7
Dark Byte, чтобы окошко вылетало надо сначала сгенерировать исключение, можно свое
C++
1
throw MyExc(std::string text, int code, и прочее)
а дальше в try catch обработать: открыть окошко с текстом, грохнуть прогу, допустить утечку памяти, поделить на 0 и прочее.
Dark Byte
-68 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
18.11.2014, 23:15  [ТС]     Как создавать информативные исключения? #8
mss307, а можно полный код?

Добавлено через 1 минуту
Цитата Сообщение от mss307 Посмотреть сообщение
а дальше в try catch обработать: открыть окошко с текстом
в этом то и вопрос как вывести это окошко?
mss307
118 / 118 / 25
Регистрация: 14.12.2013
Сообщений: 352
18.11.2014, 23:18     Как создавать информативные исключения? #9
Dark Byte, вот, например, в qt.
только по-хорошему надо наследоваться от определенного класса исключений, чтоб табличка была корректней и информативней.

я сгенерировал исключение и проигнорил его.
Миниатюры
Как создавать информативные исключения?  
Dark Byte
-68 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
18.11.2014, 23:26  [ТС]     Как создавать информативные исключения? #10
mss307, у меня не qt... но так или иначе я попробовал так - все тоже самое вылетает "Необработанное исключение по адресу ..." и все... собственно у тебя тоже не видно саму ошибку написанную при вызове...
true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
18.11.2014, 23:42     Как создавать информативные исключения? #11
Возможно тебе нужно throw std::runtime_error("some message");? То, что ты написал в первом сообщении, throw std::exception("Exception!"), вообще не должно компилироваться. А в остальном так и должно быть. При падении проги образуется корка, которую нужно подключать в отладчик и там уж внутрях копаться. Рисовать обработчиком исключения окошки - не очень разумная идея.
Dark Byte
-68 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
18.11.2014, 23:45  [ТС]     Как создавать информативные исключения? #12
Цитата Сообщение от true_bugmaker Посмотреть сообщение
throw std::runtime_error("some message");
все равно не выводит ту табличку то же что и было...
Цитата Сообщение от true_bugmaker Посмотреть сообщение
То, что ты написал в первом сообщении, throw std::exception("Exception!"), вообще не должно компилироваться
это еще почему же? у меня все компилится...
Цитата Сообщение от true_bugmaker Посмотреть сообщение
Рисовать обработчиком исключения окошки - не очень разумная идея.
но так же сделано даже в std классах (тот же string)...
rikimaru2013
C++ Game Dev
2419 / 1113 / 240
Регистрация: 30.11.2013
Сообщений: 3,660
18.11.2014, 23:52     Как создавать информативные исключения? #13
Цитата Сообщение от Dark Byte Посмотреть сообщение
внятного объяснения
1) Создаете свой класс Exception с полями char* error, int line и виртуал методом Show()
2) Унаследуйте от него еще один свой класс более конкретный FileException с полем bool file и допишите Show()
C++
1
2
3
4
5
6
void Show() 
{
Exception::Show;
cout << "FileException" << file << endl;
 
}
3) Выбрасывайте к примеру при отсуствии файла на диске
C++
1
2
3
string s("File open: can't open file");
s += filename;
throw FileException(s.getCstring(), __LINE__);
4) Ловите
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
try
{
// ...
}
catch (ZeroException& e)
{
 e.Show();
}
catch (FileException& e)
{
e.Show();
}
catch(Exception& e)
{
e.Show();
}
5) Программа не вылетит с треском и писком - а выведит на экран информативное исключенние


P.S. Про __LINE__ прочитаете тут
true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
18.11.2014, 23:57     Как создавать информативные исключения? #14
Потому что по стандарту у std::exception только два конструктора, без параметров и с параметром const exception&. http://www.cplusplus.com/reference/exception/exception/

но так же сделано даже в std классах (тот же string)...
Почему. libstdc++ никак на иксы не завязана и окошки рисовать не может просто по определению.
Dark Byte
-68 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
19.11.2014, 07:41  [ТС]     Как создавать информативные исключения? #15
rikimaru2013,
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
с полями char* error
может уж тогда std::string? плюсы же...
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
и виртуал методом Show()
а в нем что? в методе? или он чистая виртуальная функция? (=0)
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Унаследуйте от него еще один свой класс более конкретный FileException
мне не файловое так то нужно исключение ну да ладно...
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
cout << "FileException" << file << endl;
мне надо чтоб работало везде, а не только в консоли, в принципе не надо мне предлагать консольный вывод...
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
s += filename;
ладно уж опустим что вы не объявили что за filename
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
throw FileException(s.getCstring(), __LINE__);
но вот тут будет аж 2 ошибки: во 1 у string нет метода getCstring(), есть c_str(), во 2 вы не объявили конструктор с нужными параметрами...
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Программа не вылетит с треском и писком - а выведит на экран информативное исключенние
и в конце концов даже с учетом того что я поправил эту кучу ошибок она все также вылетает с обычной ошибкой "Необработанное исключение по адресу 0x75BC812F в exception.exe: исключение Microsoft C++: FileException по адресу памяти 0x0013FC48." как и было раньше...

Добавлено через 1 минуту
Цитата Сообщение от true_bugmaker Посмотреть сообщение
Потому что по стандарту у std::exception только два конструктора, без параметров и с параметром const exception&.
у меня в msvs pro 2013 есть такой конструктор...
Цитата Сообщение от true_bugmaker Посмотреть сообщение
Почему. libstdc++ никак на иксы не завязана и окошки рисовать не может просто по определению.
у меня рисует (скрин кидал)
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
19.11.2014, 07:50     Как создавать информативные исключения? #16
Цитата Сообщение от Dark Byte Посмотреть сообщение
у меня рисует (скрин кидал)
Вот что Вы прицепились к этому окошку? Там написано: Debug assertation failed. Вылезло оно потому что программа была собрана в режиме Debug и сработал макрос подобный assert. Конечные пользователи получают релизную сборку приложения, где этих окошек нет. Т.е. это сообщение - для разработчика. Хотите красивое окошко - пишите свой класс исключения со всеми необходимыми отладочными данными, перехватывайте исключение в блоке catch и поступайте как угодно - пишите в лог, рисуйте окошки или просто игнорируйте.
Dark Byte
-68 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
19.11.2014, 07:55  [ТС]     Как создавать информативные исключения? #17
Цитата Сообщение от 0x10 Посмотреть сообщение
Вот что Вы прицепились к этому окошку?
оно красивое !
Цитата Сообщение от 0x10 Посмотреть сообщение
Конечные пользователи получают релизную сборку приложения, где этих окошек нет.
но я и хочу чтобы в дебаге такое было ! я допустим пишу класс стек, который будет использоваться только внутри, мне нужна информативная ошибка о пустом стеке... исключительно для разработчика да...
Цитата Сообщение от 0x10 Посмотреть сообщение
поступайте как угодно - пишите в лог, рисуйте окошки или просто игнорируйте.
как сделано то окошко в std::string??? хочу как там !
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
19.11.2014, 07:59     Как создавать информативные исключения? #18
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Dark Byte Посмотреть сообщение
как сделано то окошко в std::string?
Если мне не изменет память о тяжелом виндовом детстве, там можно нажать "Повтор" и среда откроет часть кода с реализацией. По месту должен быть вызов assert() или что-то подобное.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 08:13     Как создавать информативные исключения?
Еще ссылки по теме:

Как создавать dll? - C++
как создавать dll по типу //инклуды #ifdef __cplusplus extern &quot;C&quot; { #endif // константы

Как создавать .h файлы? - C++
как создавать .h файлы где найти книги, уроки

Как в С++ создавать модули (библиотеки)? - C++
Подскажите как в С++ создавать модули(библиотеки)? Чем проще тем лучше)) Заранее спасибо.

Как создавать визуальные приложения на C++? - C++
как создать визуальное приложение на с++?только с помощью апи?или можно использовать стандартные библиотеки,а еще лучше самому рисовать...

Как создавать, записывать в файл - C++
Добрый вечер!:) Подскажите пожалуйста, как создавать, записывать в файл, ввод имён файлов с клавиатуры, читение данных из файла. Если можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dark Byte
-68 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
19.11.2014, 08:13  [ТС]     Как создавать информативные исключения? #19
Цитата Сообщение от 0x10 Посмотреть сообщение
Если мне не изменет память о тяжелом виндовом детстве, там можно нажать "Повтор" и среда откроет часть кода с реализацией. По месту должен быть вызов assert() или что-то подобное.
урааа ! нашел спс
C++
1
_ASSERT_EXPR(0, L"test");
Добавлено через 10 минут
даж вот так
C++
1
2
3
4
int error(const std::string &msg)
{
    return _CrtDbgReport(_CRT_ASSERT, nullptr, 0, nullptr, msg.c_str());
}
Yandex
Объявления
19.11.2014, 08:13     Как создавать информативные исключения?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru