Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
1

exception и cerr

04.09.2011, 17:52. Просмотров 2761. Ответов 20
Метки нет (Все метки)

Страуструп пишет "... Если мы не перехватим исключение, связанное с выходом за границу
допустимого диапазона индексов, или иные исключения, то сообщение об ошибке будет
записано в стандартный поток ошибок сеrr ...", собственно мне интересно как информация об не перехваченных исключениях пишется в cerr и как её оттуда можно достать (ведь не перехваченные исключения приводят к завершению выполнения программы) ?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2011, 17:52
Ответы с готовыми решениями:

cerr
Объясните почему используют std::cerr для вывода ошибок,а не обычный std::cout...

cerr
объясните пожалуйста что делает cerr? cerr - объект класса ostream, который...

Cerr и clog
У меня собственно бональнвй вопрос.. Перелопатил гугл, но так и не дошло :(...

Операторы Cerr, Clog
Помогите пожалуйста разобраться. Я уже довольно долгр прогрммирую на C++, но с...

Перенаправление std::cerr
Всем доброго времени суток! Возможно вопрос очень простой, но вразумительного...

20
Nameless One
Эксперт С++
5787 / 3436 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
04.09.2011, 18:07 2
Цитата Сообщение от Gepar Посмотреть сообщение
собственно мне интересно как информация об не перехваченных исключениях пишется в cerr
это выполняется неявно
Цитата Сообщение от Gepar Посмотреть сообщение
как её оттуда можно достать
просто-напросто перенаправить вывод stderr (если я понял вопрос):
Код
[nameless@desktop cpp]$ cat main.cc 
#include <iostream>

int main()
{
    throw 3;
    
    return 0;
}
[nameless@desktop cpp]$ make
g++ -c -Wall -g -std=c++0x main.cc
g++ -o sample  main.o
[nameless@desktop cpp]$ ./sample 2>cerr.log # перенаправляем поток ошибок в файл
Аварийный останов (core dumped)
[nameless@desktop cpp]$ cat cerr.log # содержимое этого файла
terminate called after throwing an instance of 'int'
[nameless@desktop cpp]$ ./sample 2>&1 | tee cerr.log # или так: перенаправляем stderr в stdout и используем tee, чтобы одновременно вывести stdin (т.е. ввод из пайпа) в stdout и файл
terminate called after throwing an instance of 'int'
[nameless@desktop cpp]$ cat cerr.log 
terminate called after throwing an instance of 'int'
AFAIK, в Windows cmd.exe тоже умеет перенаправление стандартных потоков
0
Nameless One
Эксперт С++
5787 / 3436 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
04.09.2011, 18:10 3
Цитата Сообщение от Gepar Посмотреть сообщение
и как её оттуда можно достать
а вообще, самый простой способ - в main установить обработчик try-catch, и весь(полезный) код программы выполнять в нем. Соответственно, перехватывать все исключения
0
LosAngeles
Заблокирован
04.09.2011, 18:14 4
я всегда думал что неперехваченные исключения ведут к terminate() или abort()
0
Сыроежка
Заблокирован
04.09.2011, 18:14 5
Цитата Сообщение от Gepar Посмотреть сообщение
Страуструп пишет "... Если мы не перехватим исключение, связанное с выходом за границу
допустимого диапазона индексов, или иные исключения, то сообщение об ошибке будет
записано в стандартный поток ошибок сеrr ...", собственно мне интересно как информация об не перехваченных исключениях пишется в cerr и как её оттуда можно достать (ведь не перехваченные исключения приводят к завершению выполнения программы) ?
Вы можете установить свою реализацию функции std::terminate(). Так как у меня сейчас под рукой шпаргалки нет, то эта функция кажется называется std::set_terminate()
0
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
04.09.2011, 18:18  [ТС] 6
Nameless One, Вы то может вопрос и правильно поняли, а вот я ответ не понял вообще. Я вижу непонятные комманды, притом адресованные как мне кажется конкретному компилятору ну и что такое [nameless@desktop cpp]$ я тоже не понял. Это код с расчётом на вставку в командную строку, который вызывает как-то g++ и компилирует код или что?
0
Сыроежка
Заблокирован
04.09.2011, 18:24 7
Цитата Сообщение от Gepar Посмотреть сообщение
Nameless One, Вы то может вопрос и правильно поняли, а вот я ответ не понял вообще. Я вижу непонятные комманды, притом адресованные как мне кажется конкретному компилятору ну и что такое [nameless@desktop cpp]$ я тоже не понял. Это код с расчётом на вставку в командную строку, который вызывает как-то g++ и компилирует код или что?
Он просто показал, как в Unix-подобной системе поток ошибок переправляется в файл. Страустроп имел в виду совсем не это, а, как я понимаю, что функция std::terminate() перед вызовом std::abort() посылает сообщение об ошибке в поток cerr.
0
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
04.09.2011, 18:26  [ТС] 8
Цитата Сообщение от Сыроежка Посмотреть сообщение
Страустроп имел в виду совсем не это, а, как я понимаю, что функция std::terminate() перед вызовом std::abort() посылает сообщение об ошибке в поток cerr.
Ну и как его посмотреть?
Я хочу сделать не перехваченное исключение и как-то посмотреть информацию об ошибке в cerr (вывод cerr в файл, а не на экран тоже подойдёт).
0
Сыроежка
Заблокирован
04.09.2011, 18:29 9
Цитата Сообщение от Gepar Посмотреть сообщение
Ну и как его посмотреть?
Я хочу сделать не перехваченное исключение и как-то посмотреть информацию об ошибке в cerr (вывод cerr в файл, а не на экран тоже подойдёт).
Для этого можно связать поток cerr с файлом, и тогда сообщения, переданные в поток cerr, попадут в файл. Как это сделать с помощью командной строки, вам было показано. Но можно это сделать и программно внутри вашего кода.
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.09.2011, 18:33 10
C
1
2
3
4
5
6
#include <cstdio>
int main()
{
    freopen("output.txt", "w", stderr);
    throw 1;
}
1
niXman
Эксперт С++
3202 / 1451 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.09.2011, 18:44 11
Цитата Сообщение от LosAngeles Посмотреть сообщение
я всегда думал что неперехваченные исключения ведут к terminate() или abort()
так и есть.
0
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 18:51 12
Gepar, зачем Вам вытаскивать что-то из cerr, если можно перехватить необработанное исключение в main, как говорилось выше?
C++
1
2
3
4
5
6
7
8
int main() {
  try {
    // ...
  }
  catch (const std::exception& e) {
    std::cerr << e.what() << std::endl;
  }
}
Цитата Сообщение от Gepar Посмотреть сообщение
Если мы не перехватим исключение, связанное с выходом за границу
допустимого диапазона индексов, или иные исключения, то сообщение об ошибке будет
записано в стандартный поток ошибок сеrr
Весьма странная фраза, т.к. многие ошибки не приводят к генерации исключений C++, так, например, деление на ноль по стандарту приводит к UB, т.е. ни о какой генерации исключения C++ речи не идет, а следственно и перехватывать нечего.
0
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
04.09.2011, 21:57  [ТС] 13
diagon, что-то с таким кодом оно никакой полезной информации не пишет в файл.
Пример:
C++
1
2
3
4
5
6
7
8
#include <cstdio>
#include <vector>
int main()
{
        freopen("output.txt", "w", stderr);
        std::vector<int> x(2);
        x.at(3)=2;
}
Я то надеялся что оно какую более полезную информацию выдаст, а оно пишет в файл всего лишь
"This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information."
0
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 22:28 14
Gepar, никто ничего полезного выводить и не должен. Как уже неоднократно было сказано выше ловите необработанные исключения самостоятельно.

Где Вы, кстати, такое прочитали (желательно с указанием конкретной страницы)?
0
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
04.09.2011, 22:48  [ТС] 15
CyBOSSeR, ну это был 3 раздел, где-то в конце одного из пунктов, я дословно скопировал слова из книги не добавляя ничего от себя. То что исключения нужно ловить это логично, я до этого не знал вообще что в cerr что либо отправляется в случае не перехваченного исключения вот и захотел узнать чуть подробнее об этом.
0
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 23:03 16
Gepar, очень странно, что Страуструп мог так написать. В случае наобработаннго исключения вызывается terminate и не о каком выводе чего либо речи не идет, по крайней мере по стандарту.
0
niXman
Эксперт С++
3202 / 1451 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.09.2011, 23:54 17
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
очень странно, что Страуструп мог так написать. В случае наобработаннго исключения вызывается terminate и не о каком выводе чего либо речи не идет, по крайней мере по стандарту.
эм..
http://www.cyberforum.ru/post1960229.html
0
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
05.09.2011, 00:08 18
niXman, возможно, я не понял тебя, но в Windows, насколько я помню, необработанное исключение приведет к завершению программы с сообщением приведенным в этом посте. Получается, что будет ли выведена информация об исключении или нет зависит от реализации.
0
niXman
Эксперт С++
3202 / 1451 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
05.09.2011, 00:11 19
CyBOSSeR, о как! хм...

Добавлено через 1 минуту
полагаю, что это зависит и от ОС/компилятора/CRT...
0
CyBOSSeR
Эксперт С++
2311 / 1684 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
05.09.2011, 00:14 20
Цитата Сообщение от niXman Посмотреть сообщение
полагаю, что это зависит и от ОС/компилятора/CRT...
Сдается мне, что в Linux с помощью std::set_teminate (или как-то еще) подсовывается функция, которая перед тем как убить процесс, выводит информацию об исключении.
0
05.09.2011, 00:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2011, 00:14

First chance exception at $77ADB09E. Exception class EAccessViolation with message 'Access Violation'. Process
Объясните в каких случаях возникает эта ошибка, из-за чего? Как справиться с...

Что и в каких случаях лучше использовать: cerr, clog, cout ?
Доброго времени суток! Подскажите пожалуйста, когда лучше использовать cerr,...

Выдаёт ошибку "Unhandled exception at 0x00007F exception: std::bad_alloc in memory location"
Добрый день, друзья не могли бы помочь разобраться, почему выдаёт такую ошибку?...


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

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

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