Используются ли исключения в C ++ только для улучшения читабельности? - PullRequest
1 голос
/ 05 января 2020

В настоящее время я испытываю трудности с поиском asp цели / использования исключений в C ++.

В других языках, с которыми я больше знаком, например, C#, исключения генерируются автоматически, если что-то идет не так. Например, деление на ноль или нарушение доступа, потому что вы получили не назначенную ссылку. То, что я делал на этих языках, заключалось в том, чтобы обернуть разделы моего кода в блоки try / catch, где могло произойти что-то ужасное. Например, обработка данных, поступающих из файла, который может быть поврежден.

Теперь, погружаясь немного глубже в C ++, я заметил, что оба деления на ноль и segfaults не генерируют исключения:

#include<iostream>

void produceCrash()
{
    int i = 1/0; // program just crashes no exception

    int* p;
    *p = 10; // same thing here
}

int main()
{
    try
    {
        produceCrash();
    }
    catch(const std::exception& e)
    {
        std::cerr << e.what() << std::endl;
    }
    catch(...)
    {
        std::cerr << "Exception thrown!" << std::endl;
    }   

    return 0;
}

Из того, что я понимаю, можно ловить только исключения, которые были явно выброшены броском. Это означало бы, что любую неожиданную ошибку просто невозможно отследить. Означает ли это, что исключения в C ++ - это просто (более чистая и более читаемая) альтернатива таким вещам, как возврат кода ошибки и просто способ управления потоком вашей программы?

1 Ответ

3 голосов
/ 05 января 2020

К сожалению, есть два вида исключений, которые легко путают новички:

Первое - это исключения на основе языка , как у вас с throw, try, catch и std::exception в C ++.

Другой тип - аппаратные исключения, например, что происходит, если вы делите на ноль или пытаетесь получить доступ к странице памяти, не принадлежащей вашему процессу.

Исключения C ++ и аппаратные исключения являются отдельными, и вы не можете использовать исключения C ++ для отлова аппаратных исключений. Как вы понимаете, вы можете только catch исключения, которые явно созданы throw.

Многие операционные системы имеют способы перехвата аппаратных исключений, хотя, например, сигналы могут использоваться в системах POSIX (как, например, SIGSEGV при попытке доступа к нераспределенной странице и т. П.). Это делает его в основном зависимым от операционной системы. Но также обратите внимание, что многие аппаратные исключения не могут быть восстановлены, вы можете их перехватить, но в любом случае не сможете продолжить работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...