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

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

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

exception и cerr - C++

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

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

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

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

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

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

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

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

20
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 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
Эксперт С++
5775 / 3425 / 255
Регистрация: 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
1177 / 533 / 20
Регистрация: 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
1177 / 533 / 20
Регистрация: 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
1930 / 1196 / 49
Регистрация: 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
Эксперт С++
3139 / 1451 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.09.2011, 18:44 #11
Цитата Сообщение от LosAngeles Посмотреть сообщение
я всегда думал что неперехваченные исключения ведут к terminate() или abort()
так и есть.
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 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
1177 / 533 / 20
Регистрация: 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
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 22:28 #14
Gepar, никто ничего полезного выводить и не должен. Как уже неоднократно было сказано выше ловите необработанные исключения самостоятельно.

Где Вы, кстати, такое прочитали (желательно с указанием конкретной страницы)?
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
04.09.2011, 22:48  [ТС] #15
CyBOSSeR, ну это был 3 раздел, где-то в конце одного из пунктов, я дословно скопировал слова из книги не добавляя ничего от себя. То что исключения нужно ловить это логично, я до этого не знал вообще что в cerr что либо отправляется в случае не перехваченного исключения вот и захотел узнать чуть подробнее об этом.
0
04.09.2011, 22:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 22:48
Привет! Вот еще темы с ответами:

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

Выдаёт ошибку "Unhandled exception at 0x00007F exception: std::bad_alloc in memory location" - C++
Добрый день, друзья не могли бы помочь разобраться, почему выдаёт такую ошибку? Вот #include &lt;iostream&gt; #include &quot;kmath.h&quot; ...

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

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


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

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

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