Arhn - архитектура программирования

При каких обстоятельствах целесообразно использовать обработку исключений?

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

Например, такие вещи, как:

  • Некорректный ввод
  • Деление на ноль
  • Неверный тип
  • Проверка диапазона контейнеров
  • Нулевой указатель
  • Неинициализированные данные

... и так далее.

Может ли кто-нибудь привести пример, в котором было бы лучше обрабатывать исключения?


  • Сбой выделения памяти. 26.08.2013
  • @avakar bad_alloc уже исключение, нам ничего не остается, как попытаться его поймать. Я говорю о пользовательском коде — когда он будет необходим? 26.08.2013
  • Встроенное программирование, если вы обнаружите проблемы с вашим оборудованием. 26.08.2013
  • возможный дубликат Когда и как следует использовать обработку исключений? 26.08.2013
  • @Sambuca Не могли бы вы объяснить, пожалуйста? Я не понимаю. 26.08.2013
  • Большинство из них обычно не дают исключений в C++. Деление на ноль, нулевой указатель и неинициализированные данные приводят к неопределенному поведению, проверка типов (почти всегда) статическая, а стандартные контейнеры дают вам выбор между проверенным и непроверенным доступом. Это оставляет только недопустимый ввод, и только вам решать, как с этим справиться. 26.08.2013
  • Например, если мы обнаружим проблемы с нашими источниками напряжения, датчиками или исполнительными механизмами. Все, что может привести к неопределенному поведению нашей системы. 26.08.2013
  • Простой ответ — когда ошибка не может быть обработана локально; полный ответ занял бы главу или две книги. 26.08.2013
  • Я бы использовал исключение, когда хочу поймать ошибку не в той же области функции «A», а в какой-то другой функции «B», которая имеет зависимость от функции «A». Но обе функции «A» и «B» присутствуют в одной и той же программе или бинарной области. Пожалуйста, обратитесь к принципу разматывания стопки. 26.08.2013
  • Как вернуть код ошибки из конструктора? ;) 26.08.2013
  • syam : - Я бы использовал механизм обработки исключений в конструкторе. Уже задано много вопросов по обработке исключений в конструкторе. 27.08.2013

Ответы:


1

Исключения становятся более важными по мере роста размера вашей программы.

С кодами возврата простого приложения, вероятно, все в порядке. Но когда состояние ошибки должно подняться на пару уровней стека, прежде чем оно будет обработано, имеет смысл использовать исключения вместо передачи кодов ошибок из каждой функции.

Кроме того, когда метод уже возвращает значение, может быть нецелесообразно или невозможно также возвращать код ошибки из функции.

26.08.2013
  • Хотя @Oleksiy принял это как ответ, я не думаю, что это отвечает на вопросы. При поиске в коллекции заданного элемента генерация исключения, если элемент не найден, в большинстве случаев не подходит. В большинстве случаев более подходящим будет код возврата или флаг, указывающий, что не найдено. Как правило, я бы не использовал исключения, если результат: а) не совсем исключительный, но довольно распространенный и/или б) случай сбоя можно обработать локально. 26.08.2013

  • 2

    Иногда использование исключения чище. В функции foo благодаря генерированию исключений в функции check вы можете не проверять, что возвращает check, что делает эту функцию проще:

    #include<iostream>
    using namespace std;
    
    class A{
    public:
        int a_foo(int index){return _tab[index];}    
    private:
        static int _tab[3];
    };
    int A::_tab[3]={1,2,3};
    
    void check(int index)
    {
        if (index < 0 || index > 2)  
                throw string("invalid index");  
    }
    
    void foo(A a, int index){
        check(index);
        cout << a.a_foo(index) << endl;
    }
    
    int main()
    {
        try 
        {   
            A a;
            foo(a,4);    
        }   
        catch(string ex) 
        {   
            cerr << ex <<'\n';
        }   
    }
    
    26.08.2013

    3

    Я бы использовал его, когда следствием какого-то неожиданного «события» является невозможность продолжения работы приложения. Когда это произойдет, и вы поймаете это, сообщите об этом и закройте приложение (или что-то еще, что, по вашему мнению, вы должны сделать в этом случае).

    26.08.2013
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..