Безопасность при исключениях - когда, как, почему?

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

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

Вот моя функция всплывающего окна:

void List::pop_front()
{
    if(!head_)
        throw std::length_error("Pop front:  List is empty.\n");
    else
    {
        ListElem *temp = head_;
        head_          = head_->next;
        head_->prev    = 0;
        delete temp;
        --size_;
    }
}

У меня были некоторые дилеммы с этим.

1) Должен ли я действительно выдавать ошибку, когда список не работает? Не следует t Я просто ничего не делаю и возвращаюсь вместо того, чтобы заставлять пользователя списка выполнять инструкции try {] catch () {} (которые также медленные).

2) Есть несколько классов ошибок (плюс ListException, мой учитель требования, которые мы реализуем в классе). Действительно ли для этого необходим специальный класс ошибок и есть ли общее руководство о том, когда использовать конкретный класс исключения? (Например, диапазон, длина и граница звучат одинаково)

3) Я знаю, что не должен изменять состояние программы, пока не будет выполнен весь этот код, который вызвал исключение. Вот почему я уменьшаю size_ last. Действительно ли это необходимо в этом простом примере? Я знаю, что удалить нельзя. Возможно ли, чтобы head _-> prev когда-либо бросал при присвоении 0? (голова - это первый узел)

Моя функция push_back:

void List::push_back(const T& data)
{
    if(!tail_)
    {
        tail_ = new ListElem(data, 0, 0);
        head_ = tail_;
    }
    else
    {
    tail_->next = new ListElem(data, 0, tail_);
    tail_ = tail_->next;
    }
    ++size_;
}

1) Я часто слышу, что что угодно может дать сбой в программе на C ++. Реально ли проверить, не работает ли конструктор ListElem (или tail_ во время new ing)?

2) Будет ли когда-либо необходимо тестировать тип данных (в настоящее время простой typedef int T , пока я не буду все шаблонизировать), чтобы убедиться, что тип применим для структуры?

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

10
задан IAE 19 December 2010 в 13:12
поделиться