Об обработке исключений в C ++

0

Я читаю литературу о "C++ обработке исключений" (EH) из разных ресурсов. Я понял понятия, а также синтаксис. НО В большем масштабе я смущен.

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

  2. Я столкнулся с утверждениями, которые говорят, что EH используется для восстановления ошибок. Но мне нужен конкретный пример, чтобы узнать, что означает восстановление ошибок/как это делается, особенно в C++ EH.

Теги:
exception
exception-handling
visual-c++

4 ответа

1

Когда генерируется исключение, выполнение не продолжается с точки сразу после того, как было выбрано исключение. Скорее, выполнение переносится обратно в "ближайший" 1 блок catch который может поймать тип исключенного исключения. После выполнения кода в этом блоке catch выполнение продолжается в любом коде после него, как обычно. Это может (в конце концов) вернуться к коду, в котором было выбрано исключение, но 1) не обязательно, и 2) если это так, повторяет код, ведущий к этой точке, поэтому, если исключение не выбрано (по какой-либо причине) можно ожидать, что следующий код будет выполняться нормально (предполагая, конечно, что другой код является безопасным для исключения, поэтому в этом процессе ничего не произошло).

Трудно найти хорошие примеры обработки ошибок с использованием исключений (или иначе, TBH), в основном по некоторым из тех же причин для использования EH для начала - код для правильной обработки исключения должным образом часто (обычно?) Довольно специфичен для приложение под рукой. Для некоторых небольших утилит и т.д. Он может просто распечатать сообщение об ошибке и выйти. Для сервера, который должен работать независимо от того, что происходит, он может записать что-то в журнал, а затем продолжить выполнение.


  1. Здесь "ближайший" не имеет никакого отношения к местоположению в исходном коде - он основан на выполнении. Когда код в блоке try выполняется, соответствующий блок catch настраивается в стиле стека. Когда генерируется исключение, стек разматывается до тех пор, пока не достигнет блока catch который мог бы обработать исключение, которое было выбрано.
0

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

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

  1. Очевидно, что выполнение может продолжаться всякий раз, когда происходит исключение. Просто поймайте его в точке, где есть альтернативный маршрут для исполнения. В конечном итоге просто не выполняйте программу вообще. Конечно, вы должны признать отказ выполнить как возможность. Однако все остальное было бы совершенным и несколько нереалистичным.
  2. Я рекомендую книги Herb Sutter "Исключительные C++" (см. Http://www.gotw.ca/publications/xC++s.htm) или его проводки "Гуру за неделю", например http://www.gotw.ca/gotw/059.htm

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

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

0

Примечание EH = Обработка исключений

Мы делаем EH, чтобы убедиться, что мы не получаем ненормальное поведение программы во время выполнения, что может быть связано с некоторыми неожиданными вводами/данными в любой момент выполнения или повреждением данных при обработке. Это зависит от разработчика, как он обрабатывает исключение (я), то есть показывает любое сообщение об ошибке или исправляет данные и продолжает.

например

class PlayGame{
private:
 /* variable */
public:
bool inputUserName() throw(){
   **** if user do not enter name throw exception
}
void play(){
********
}
void end(){
 ****
}
};

void game() throw(){
     PlayGame pg;
     pg.inputUserName();
     pg.play();
     pg.end();
}
void main(){
  /* one way of work */
  try{
     game()
  }catch (exception& e){
      cout<<"Error occour.. user name missing..\n";
  }

  /* second way can be */ 
try{
     game();
  }catch (exception& e){
     cout<<"Please enter name first...\n";
     game();
  }
}

Это хороший пример понимания EH в c++

0

Исключения составляют системы безопасности, но они не предназначены для обработки ошибок программиста (т.е. segfaults)

Например, скажем, вы пытаетесь прочитать файл на диске, который еще не написан, но вы знаете, что это будет в какой-то момент. Вы хотите сбить и сжечь весь процесс? Возможно нет.

Если вы поймали какое-то исключение, указывающее, что файл еще не был, вы можете обработать его соответствующим образом, повторив позже, или зарегистрировав какое-то сообщение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню