Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

я сгенерировал исключение и проигнорил его.
0
Миниатюры
Как создавать информативные исключения?  
Dark Byte
-17 / 46 / 12
Регистрация: 23.10.2014
Сообщений: 1,001
Завершенные тесты: 2
18.11.2014, 23:26  [ТС] #10
mss307, у меня не qt... но так или иначе я попробовал так - все тоже самое вылетает "Необработанное исключение по адресу ..." и все... собственно у тебя тоже не видно саму ошибку написанную при вызове...
0
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!"), вообще не должно компилироваться. А в остальном так и должно быть. При падении проги образуется корка, которую нужно подключать в отладчик и там уж внутрях копаться. Рисовать обработчиком исключения окошки - не очень разумная идея.
0
Dark Byte
-17 / 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)...
0
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
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__ прочитаете тут
0
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++ никак на иксы не завязана и окошки рисовать не может просто по определению.
0
Dark Byte
-17 / 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++ никак на иксы не завязана и окошки рисовать не может просто по определению.
у меня рисует (скрин кидал)
0
19.11.2014, 07:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 07:41
Привет! Вот еще темы с ответами:

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

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

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

Как создавать папки с поролем - C++
Здраствуйте, помогите пожалуйсто, как сделать так чтобы программа создавала папку под паролем? Добавлено через 3 часа 32 минуты Ну...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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