Я всего лишь начинающий программист, который хотя бы пытается запрограммировать больше, чем в лучшем случае. Я читал книгу Херба Саттера «Исключительный 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, а когда нет.