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

exception и cerr - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
04.09.2011, 17:52     exception и cerr #1
Страуструп пишет "... Если мы не перехватим исключение, связанное с выходом за границу
допустимого диапазона индексов, или иные исключения, то сообщение об ошибке будет
записано в стандартный поток ошибок сеrr ...", собственно мне интересно как информация об не перехваченных исключениях пишется в cerr и как её оттуда можно достать (ведь не перехваченные исключения приводят к завершению выполнения программы) ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2011, 17:52     exception и cerr
Посмотрите здесь:

cerr C++
C++ cerr
Exception C++
C++ exception
C++ Операторы Cerr, Clog
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
04.09.2011, 18:07     exception и cerr #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 тоже умеет перенаправление стандартных потоков
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
04.09.2011, 18:10     exception и cerr #3
Цитата Сообщение от Gepar Посмотреть сообщение
и как её оттуда можно достать
а вообще, самый простой способ - в main установить обработчик try-catch, и весь(полезный) код программы выполнять в нем. Соответственно, перехватывать все исключения
LosAngeles
Заблокирован
04.09.2011, 18:14     exception и cerr #4
я всегда думал что неперехваченные исключения ведут к terminate() или abort()
Сыроежка
Заблокирован
04.09.2011, 18:14     exception и cerr #5
Цитата Сообщение от Gepar Посмотреть сообщение
Страуструп пишет "... Если мы не перехватим исключение, связанное с выходом за границу
допустимого диапазона индексов, или иные исключения, то сообщение об ошибке будет
записано в стандартный поток ошибок сеrr ...", собственно мне интересно как информация об не перехваченных исключениях пишется в cerr и как её оттуда можно достать (ведь не перехваченные исключения приводят к завершению выполнения программы) ?
Вы можете установить свою реализацию функции std::terminate(). Так как у меня сейчас под рукой шпаргалки нет, то эта функция кажется называется std::set_terminate()
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
04.09.2011, 18:18  [ТС]     exception и cerr #6
Nameless One, Вы то может вопрос и правильно поняли, а вот я ответ не понял вообще. Я вижу непонятные комманды, притом адресованные как мне кажется конкретному компилятору ну и что такое [nameless@desktop cpp]$ я тоже не понял. Это код с расчётом на вставку в командную строку, который вызывает как-то g++ и компилирует код или что?
Сыроежка
Заблокирован
04.09.2011, 18:24     exception и cerr #7
Цитата Сообщение от Gepar Посмотреть сообщение
Nameless One, Вы то может вопрос и правильно поняли, а вот я ответ не понял вообще. Я вижу непонятные комманды, притом адресованные как мне кажется конкретному компилятору ну и что такое [nameless@desktop cpp]$ я тоже не понял. Это код с расчётом на вставку в командную строку, который вызывает как-то g++ и компилирует код или что?
Он просто показал, как в Unix-подобной системе поток ошибок переправляется в файл. Страустроп имел в виду совсем не это, а, как я понимаю, что функция std::terminate() перед вызовом std::abort() посылает сообщение об ошибке в поток cerr.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
04.09.2011, 18:26  [ТС]     exception и cerr #8
Цитата Сообщение от Сыроежка Посмотреть сообщение
Страустроп имел в виду совсем не это, а, как я понимаю, что функция std::terminate() перед вызовом std::abort() посылает сообщение об ошибке в поток cerr.
Ну и как его посмотреть?
Я хочу сделать не перехваченное исключение и как-то посмотреть информацию об ошибке в cerr (вывод cerr в файл, а не на экран тоже подойдёт).
Сыроежка
Заблокирован
04.09.2011, 18:29     exception и cerr #9
Цитата Сообщение от Gepar Посмотреть сообщение
Ну и как его посмотреть?
Я хочу сделать не перехваченное исключение и как-то посмотреть информацию об ошибке в cerr (вывод cerr в файл, а не на экран тоже подойдёт).
Для этого можно связать поток cerr с файлом, и тогда сообщения, переданные в поток cerr, попадут в файл. Как это сделать с помощью командной строки, вам было показано. Но можно это сделать и программно внутри вашего кода.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.09.2011, 18:33     exception и cerr #10
C
1
2
3
4
5
6
#include <cstdio>
int main()
{
    freopen("output.txt", "w", stderr);
    throw 1;
}
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.09.2011, 18:44     exception и cerr #11
Цитата Сообщение от LosAngeles Посмотреть сообщение
я всегда думал что неперехваченные исключения ведут к terminate() или abort()
так и есть.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 18:51     exception и cerr #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++ речи не идет, а следственно и перехватывать нечего.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
04.09.2011, 21:57  [ТС]     exception и cerr #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."
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 22:28     exception и cerr #14
Gepar, никто ничего полезного выводить и не должен. Как уже неоднократно было сказано выше ловите необработанные исключения самостоятельно.

Где Вы, кстати, такое прочитали (желательно с указанием конкретной страницы)?
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
04.09.2011, 22:48  [ТС]     exception и cerr #15
CyBOSSeR, ну это был 3 раздел, где-то в конце одного из пунктов, я дословно скопировал слова из книги не добавляя ничего от себя. То что исключения нужно ловить это логично, я до этого не знал вообще что в cerr что либо отправляется в случае не перехваченного исключения вот и захотел узнать чуть подробнее об этом.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 23:03     exception и cerr #16
Gepar, очень странно, что Страуструп мог так написать. В случае наобработаннго исключения вызывается terminate и не о каком выводе чего либо речи не идет, по крайней мере по стандарту.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.09.2011, 23:54     exception и cerr #17
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
очень странно, что Страуструп мог так написать. В случае наобработаннго исключения вызывается terminate и не о каком выводе чего либо речи не идет, по крайней мере по стандарту.
эм..
http://www.cyberforum.ru/post1960229.html
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.09.2011, 00:08     exception и cerr #18
niXman, возможно, я не понял тебя, но в Windows, насколько я помню, необработанное исключение приведет к завершению программы с сообщением приведенным в этом посте. Получается, что будет ли выведена информация об исключении или нет зависит от реализации.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
05.09.2011, 00:11     exception и cerr #19
CyBOSSeR, о как! хм...

Добавлено через 1 минуту
полагаю, что это зависит и от ОС/компилятора/CRT...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2011, 00:14     exception и cerr
Еще ссылки по теме:

Перенаправление std::cerr C++
First chance exception at $77ADB09E. Exception class EAccessViolation with message 'Access Violation'. Process C++
C++ Cerr и clog

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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.09.2011, 00:14     exception и cerr #20
Цитата Сообщение от niXman Посмотреть сообщение
полагаю, что это зависит и от ОС/компилятора/CRT...
Сдается мне, что в Linux с помощью std::set_teminate (или как-то еще) подсовывается функция, которая перед тем как убить процесс, выводит информацию об исключении.
Yandex
Объявления
05.09.2011, 00:14     exception и cerr
Ответ Создать тему
Опции темы

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