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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

exception и cerr - C++

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

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

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

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

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

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

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

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

exception - C++
Суть такова , она нормально не работает , и выкидывает исключение , не могу понять в чем дело #include<iostream> #include<cstdio> ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
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
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
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
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
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
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
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
1927 / 1193 / 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++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.09.2011, 18:44     exception и cerr #11
Цитата Сообщение от LosAngeles Посмотреть сообщение
я всегда думал что неперехваченные исключения ведут к terminate() или abort()
так и есть.
CyBOSSeR
Эксперт C++
2299 / 1669 / 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
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
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++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 22:28     exception и cerr #14
Gepar, никто ничего полезного выводить и не должен. Как уже неоднократно было сказано выше ловите необработанные исключения самостоятельно.

Где Вы, кстати, такое прочитали (желательно с указанием конкретной страницы)?
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
04.09.2011, 22:48  [ТС]     exception и cerr #15
CyBOSSeR, ну это был 3 раздел, где-то в конце одного из пунктов, я дословно скопировал слова из книги не добавляя ничего от себя. То что исключения нужно ловить это логично, я до этого не знал вообще что в cerr что либо отправляется в случае не перехваченного исключения вот и захотел узнать чуть подробнее об этом.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 23:03     exception и cerr #16
Gepar, очень странно, что Страуструп мог так написать. В случае наобработаннго исключения вызывается terminate и не о каком выводе чего либо речи не идет, по крайней мере по стандарту.
niXman
Эксперт C++
3134 / 1446 / 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++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.09.2011, 00:08     exception и cerr #18
niXman, возможно, я не понял тебя, но в Windows, насколько я помню, необработанное исключение приведет к завершению программы с сообщением приведенным в этом посте. Получается, что будет ли выведена информация об исключении или нет зависит от реализации.
niXman
Эксперт C++
3134 / 1446 / 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
Еще ссылки по теме:

Exception - C++
Реализовать свой класс исключений zero, производный от std::exception (используется при попытке деления вектора на ноль). В классе zero...

C++ exception - C++
Доброго времени суток. Делал лабу, описал класс матрица в котором есть метод нахождения обратной матрицы: double det = m.det(); if(det...

Не ловит exception - C++
Почему не ловится range error? #include &lt;iostream&gt; #include &lt;stdexcept&gt; #include &lt;string&gt; using namespace std; int main() ...

Обработка exception - C++
Возникла такая проблема и не могу понять как ее реализовать... cin &gt;&gt; totalitems; // вот здесь в случае ввода не цифр, выбить ошибку и...

Unhandled exception - C++
Вообщем вот рабочая программа, но в конце вываливается с ошибкой: Unhandled exception at ... Access violation writing location... Но...


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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
2299 / 1669 / 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
Ответ Создать тему
Опции темы

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