Я просто молодой программист, который, по крайней мере, пытается запрограммировать больше, чем лучший сценарий. Я читал "Herb Sutter" "Исключительный С++" и три раза до сих пор встречался с исключениями. Однако, запретив пример, который он поставил (стек), я не совсем уверен, когда именно я должен стремиться к безопасности исключений против скорости, и когда это просто глупо, чтобы это сделать.
Например, мой текущий проект домашней работы представляет собой двусвязный список. Поскольку я уже запрограммировал пару из них, я хотел потратить время, чтобы перейти к более глубоким понятиям, таким как ES.
Вот моя функция pop-front:
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) Должен ли я действительно выдавать ошибку при сбое списка? Не следует ли мне просто ничего не делать и возвращать, а не принуждать пользователя списка выполнять try {] catch() {} (что тоже медленно).
2) Существует несколько классов ошибок (плюс ListException, которые мой учитель требует реализовать в классе). Является ли особый класс ошибок действительно необходимым для такой вещи, и существует ли общее руководство по использованию конкретного класса исключений? (Например, диапазон, длина и граница все одинаковые)
3) Я знаю, что я не должен изменять состояние программы до тех пор, пока не будет выполнен весь этот код, который сделал исключение. Вот почему я уменьшаю size_ last. Действительно ли это необходимо в этом простом примере? Я знаю, что удалить нельзя. Возможно ли, чтобы головка _- > prev когда-либо бросалась при назначении 0? (голова - первая Node)
Функция 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) Я часто слышу, что что-то может сбой в программе на С++. Является ли реалистичным проверить, не сработает ли конструктор для ListElem (или tail_ во время new
ing)?
2) Будет ли когда-либо понадобиться проверять тип данных (в настоящее время простой typedef int T
, пока я не планирую все), чтобы убедиться, что тип является жизнеспособным для структуры?
Я понимаю, что это слишком простые примеры, но в настоящее время я просто смущен, когда должен практиковать хорошую ES, а когда нет.