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

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

Восстановить пароль Регистрация
 
Dark Byte
6 / 23 / 4
Регистрация: 23.10.2014
Сообщений: 850
Завершенные тесты: 2
18.11.2014, 22:36     Как создавать информативные исключения? #1
как создавать информативные исключения??? нигде не могу найти внятного объяснения единственный способ какой я знаю 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++
Как создавать папки с поролем C++
как создавать dll C++
C++ Как свиртуализировать исключения?
Как бросать эти исключения? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
true_bugmaker
28 / 5 / 1
Регистрация: 18.11.2014
Сообщений: 68
18.11.2014, 22:41     Как создавать информативные исключения? #2
Ты их отлавливай при помощи try {} catch {}, они для этого же.
Dark Byte
6 / 23 / 4
Регистрация: 23.10.2014
Сообщений: 850
Завершенные тесты: 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
6 / 23 / 4
Регистрация: 23.10.2014
Сообщений: 850
Завершенные тесты: 2
18.11.2014, 22:59  [ТС]     Как создавать информативные исключения? #5
true_bugmaker, так я же и сам знаю где у меня будет исключение... я просто по if это определяю... что мне cerr этот, он только для консольных программ, да и вообще это не то, я хочу чтоб прям брякалась программа на этом исключении и выкидывала табличку с информацией об ошибке (т.е. в любом приложении, вне зависимости от того консольное оно или нет)
Dark Byte
6 / 23 / 4
Регистрация: 23.10.2014
Сообщений: 850
Завершенные тесты: 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
6 / 23 / 4
Регистрация: 23.10.2014
Сообщений: 850
Завершенные тесты: 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
6 / 23 / 4
Регистрация: 23.10.2014
Сообщений: 850
Завершенные тесты: 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
6 / 23 / 4
Регистрация: 23.10.2014
Сообщений: 850
Завершенные тесты: 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
 Аватар для rikimaru2013
2135 / 968 / 223
Регистрация: 30.11.2013
Сообщений: 3,239
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
6 / 23 / 4
Регистрация: 23.10.2014
Сообщений: 850
Завершенные тесты: 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
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
19.11.2014, 07:50     Как создавать информативные исключения? #16
Цитата Сообщение от Dark Byte Посмотреть сообщение
у меня рисует (скрин кидал)
Вот что Вы прицепились к этому окошку? Там написано: Debug assertation failed. Вылезло оно потому что программа была собрана в режиме Debug и сработал макрос подобный assert. Конечные пользователи получают релизную сборку приложения, где этих окошек нет. Т.е. это сообщение - для разработчика. Хотите красивое окошко - пишите свой класс исключения со всеми необходимыми отладочными данными, перехватывайте исключение в блоке catch и поступайте как угодно - пишите в лог, рисуйте окошки или просто игнорируйте.
Dark Byte
6 / 23 / 4
Регистрация: 23.10.2014
Сообщений: 850
Завершенные тесты: 2
19.11.2014, 07:55  [ТС]     Как создавать информативные исключения? #17
Цитата Сообщение от 0x10 Посмотреть сообщение
Вот что Вы прицепились к этому окошку?
оно красивое !
Цитата Сообщение от 0x10 Посмотреть сообщение
Конечные пользователи получают релизную сборку приложения, где этих окошек нет.
но я и хочу чтобы в дебаге такое было ! я допустим пишу класс стек, который будет использоваться только внутри, мне нужна информативная ошибка о пустом стеке... исключительно для разработчика да...
Цитата Сообщение от 0x10 Посмотреть сообщение
поступайте как угодно - пишите в лог, рисуйте окошки или просто игнорируйте.
как сделано то окошко в std::string??? хочу как там !
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
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     Как создавать информативные исключения?
Еще ссылки по теме:

как создавать циклы? C++
как создавать .h файлы? C++
Как правильно вызывать исключения? C++

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

Или воспользуйтесь поиском по форуму:
Dark Byte
6 / 23 / 4
Регистрация: 23.10.2014
Сообщений: 850
Завершенные тесты: 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     Как создавать информативные исключения?
Ответ Создать тему
Опции темы

Текущее время: 06:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru