Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

exception и cerr

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

Студворк — интернет-сервис помощи студентам
Страуструп пишет "... Если мы не перехватим исключение, связанное с выходом за границу
допустимого диапазона индексов, или иные исключения, то сообщение об ошибке будет
записано в стандартный поток ошибок сеrr ...", собственно мне интересно как информация об не перехваченных исключениях пишется в cerr и как её оттуда можно достать (ведь не перехваченные исключения приводят к завершению выполнения программы) ?
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.09.2011, 17:52
Ответы с готовыми решениями:

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

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

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

20
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.09.2011, 18:07
Цитата Сообщение от Gepar Посмотреть сообщение
собственно мне интересно как информация об не перехваченных исключениях пишется в cerr
это выполняется неявно
Цитата Сообщение от Gepar Посмотреть сообщение
как её оттуда можно достать
просто-напросто перенаправить вывод stderr (если я понял вопрос):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[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
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.09.2011, 18:10
Цитата Сообщение от Gepar Посмотреть сообщение
и как её оттуда можно достать
а вообще, самый простой способ - в main установить обработчик try-catch, и весь(полезный) код программы выполнять в нем. Соответственно, перехватывать все исключения
0
Заблокирован
04.09.2011, 18:14
я всегда думал что неперехваченные исключения ведут к terminate() или abort()
0
Заблокирован
04.09.2011, 18:14
Цитата Сообщение от Gepar Посмотреть сообщение
Страуструп пишет "... Если мы не перехватим исключение, связанное с выходом за границу
допустимого диапазона индексов, или иные исключения, то сообщение об ошибке будет
записано в стандартный поток ошибок сеrr ...", собственно мне интересно как информация об не перехваченных исключениях пишется в cerr и как её оттуда можно достать (ведь не перехваченные исключения приводят к завершению выполнения программы) ?
Вы можете установить свою реализацию функции std::terminate(). Так как у меня сейчас под рукой шпаргалки нет, то эта функция кажется называется std::set_terminate()
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
04.09.2011, 18:18  [ТС]
Nameless One, Вы то может вопрос и правильно поняли, а вот я ответ не понял вообще. Я вижу непонятные комманды, притом адресованные как мне кажется конкретному компилятору ну и что такое [nameless@desktop cpp]$ я тоже не понял. Это код с расчётом на вставку в командную строку, который вызывает как-то g++ и компилирует код или что?
0
Заблокирован
04.09.2011, 18:24
Цитата Сообщение от Gepar Посмотреть сообщение
Nameless One, Вы то может вопрос и правильно поняли, а вот я ответ не понял вообще. Я вижу непонятные комманды, притом адресованные как мне кажется конкретному компилятору ну и что такое [nameless@desktop cpp]$ я тоже не понял. Это код с расчётом на вставку в командную строку, который вызывает как-то g++ и компилирует код или что?
Он просто показал, как в Unix-подобной системе поток ошибок переправляется в файл. Страустроп имел в виду совсем не это, а, как я понимаю, что функция std::terminate() перед вызовом std::abort() посылает сообщение об ошибке в поток cerr.
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
04.09.2011, 18:26  [ТС]
Цитата Сообщение от Сыроежка Посмотреть сообщение
Страустроп имел в виду совсем не это, а, как я понимаю, что функция std::terminate() перед вызовом std::abort() посылает сообщение об ошибке в поток cerr.
Ну и как его посмотреть?
Я хочу сделать не перехваченное исключение и как-то посмотреть информацию об ошибке в cerr (вывод cerr в файл, а не на экран тоже подойдёт).
0
Заблокирован
04.09.2011, 18:29
Цитата Сообщение от Gepar Посмотреть сообщение
Ну и как его посмотреть?
Я хочу сделать не перехваченное исключение и как-то посмотреть информацию об ошибке в cerr (вывод cerr в файл, а не на экран тоже подойдёт).
Для этого можно связать поток cerr с файлом, и тогда сообщения, переданные в поток cerr, попадут в файл. Как это сделать с помощью командной строки, вам было показано. Но можно это сделать и программно внутри вашего кода.
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.09.2011, 18:33
C
1
2
3
4
5
6
#include <cstdio>
int main()
{
    freopen("output.txt", "w", stderr);
    throw 1;
}
1
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.09.2011, 18:44
Цитата Сообщение от LosAngeles Посмотреть сообщение
я всегда думал что неперехваченные исключения ведут к terminate() или abort()
так и есть.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 18:51
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
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
04.09.2011, 21:57  [ТС]
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
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 22:28
Gepar, никто ничего полезного выводить и не должен. Как уже неоднократно было сказано выше ловите необработанные исключения самостоятельно.

Где Вы, кстати, такое прочитали (желательно с указанием конкретной страницы)?
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
04.09.2011, 22:48  [ТС]
CyBOSSeR, ну это был 3 раздел, где-то в конце одного из пунктов, я дословно скопировал слова из книги не добавляя ничего от себя. То что исключения нужно ловить это логично, я до этого не знал вообще что в cerr что либо отправляется в случае не перехваченного исключения вот и захотел узнать чуть подробнее об этом.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 23:03
Gepar, очень странно, что Страуструп мог так написать. В случае наобработаннго исключения вызывается terminate и не о каком выводе чего либо речи не идет, по крайней мере по стандарту.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
04.09.2011, 23:54
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
очень странно, что Страуструп мог так написать. В случае наобработаннго исключения вызывается terminate и не о каком выводе чего либо речи не идет, по крайней мере по стандарту.
эм..
https://www.cyberforum.ru/post1960229.html
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
05.09.2011, 00:08
niXman, возможно, я не понял тебя, но в Windows, насколько я помню, необработанное исключение приведет к завершению программы с сообщением приведенным в этом посте. Получается, что будет ли выведена информация об исключении или нет зависит от реализации.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
05.09.2011, 00:11
CyBOSSeR, о как! хм...

Добавлено через 1 минуту
полагаю, что это зависит и от ОС/компилятора/CRT...
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
05.09.2011, 00:14
Цитата Сообщение от niXman Посмотреть сообщение
полагаю, что это зависит и от ОС/компилятора/CRT...
Сдается мне, что в Linux с помощью std::set_teminate (или как-то еще) подсовывается функция, которая перед тем как убить процесс, выводит информацию об исключении.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.09.2011, 00:14
Помогаю со студенческими работами здесь

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

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

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

Unhandled exception at at 0x75E717D2 in ConsoleApplication24.exe: Microsoft C++ exception: std::out_of_range at memory l
Здравствуйте, помогите пожалуйста, при проходе через последний цикл выдаёт вот такую ошибку: Unhandled exception at at 0x75E717D2 in...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru