Nano Hash - криптовалюты, майнинг, программирование

Может ли cout генерировать исключение?

  • cout является экземпляром типа "ostream"
  • ostream::operator‹‹ говорит, что

    If the operation sets an internal state flag that was registered with
    member exceptions, the function throws an exception of member type failure.
    

Это указывает мне, что cout может генерировать исключение. Это правда? Какой сценарий может вызвать это?

22.06.2018

  • Да, верно, как и с любым iostream. Используйте cout.exceptions(mask), где mask указывает условия ошибки (badbit или failbit), при которых должны создаваться исключения. Затем сделайте что-нибудь, чтобы вызвать одно или несколько состояний ошибки в потоке, например, неверную операцию вывода или (проще говоря) использование std::cout.setstate(mask). 22.06.2018
  • Нет, std::cout не может создать исключение. Это объект (ну, как правило, ссылка на объект), а не функция. Функции, работающие с std::cout, могут генерировать исключения. Потоковые вставки (operator<<) — это функции. 22.06.2018

Ответы:


1

Да, но практически никто никогда не вызывает cout.exceptions(iostate), чтобы включить это.

Изменить, чтобы разъяснить:

std::ios_base — это абстрактный класс, предоставляющий базовые служебные функции для всех потоков. std::ios_base<CharT, Traits> является его абстрактным подклассом, добавляющим дополнительные служебные функции.

std::ios_base::iostate — это тип битовой маски, состоящий из следующих битов, может быть ored:

badbit (used for weird underlying errors)
eofbit (used after you hit EOF)
failbit (the normal error for badly-formatted input)

Кроме того, iostate::goodbit эквивалентно iostate() (в основном 0).

Обычно, когда вы выполняете ввод-вывод, вы проверяете логическое значение потока, чтобы увидеть, не произошла ли ошибка, после каждой операции ввода, например. if (cin >> val) { cout << val; } ... для вывода можно просто сгенерировать кучу и проверить успех только в конце (или для cout вообще не проверять).

Однако некоторые люди предпочитают исключения, поэтому каждый отдельный поток можно настроить так, чтобы некоторые из этих возвращаемых значений превращались в исключения:

std::ios_base::iostate exceptions() const;
void exceptions(std::ios_base::iostate except);

В C++ это делается редко, поскольку мы не поклоняемся бездумно исключениям, как адепты некоторых других языков. В частности, "что-то пошло не так с вводом/выводом" является обычным случаем, поэтому нет смысла искажать поток управления.

Пример:

$ cat cout.cpp
#include <iostream>

int main()
{
    std::cout.exceptions(std::cout.badbit);

    std::cout << "error if written to a pipe" << std::endl;
}
$ sh -c 'trap "" PIPE; ./cout | true'
vvv 2018-06-21 23:33:13-0700
terminate called after throwing an instance of 'std::ios_base::failure[abi:cxx11]'
  what():  basic_ios::clear: iostream error
Aborted

(Обратите внимание, что в системах Unix вы должны игнорировать SIGPIPE, чтобы программа имела шанс обрабатывать такие ошибки, поскольку для многих программ правильный выход - это это вообще то, что позволяет head работать)

22.06.2018
  • Если бы вы могли немного уточнить, я отмечу ваш ответ как правильный 22.06.2018
  • @DeepDeadpool разъяснил 22.06.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..