Команды throw / try / catch работают сообща, чтобы понятно и предсказуемо управлять поведением программы в случае аварийных ситуаций. Аварийная ситуация — это такая ситуация, когда программа не может продолжать работать нормально. Например, если файл не открылся, то мы не сможем из него ничего прочитать; и закрывать его тогда тоже не надо.

```
#include <stdexcept>
using namespace std;
try {  // ограничиваем блок кода, где мы ожидаем появление ошибки
    ifstream f;
    f.open ("file.txt", ios::in);  // пытаемся открыть файл
    if (!f)   // не получилось открыть: файла нет, проблема с диском и т.п.
        throw runtime_error ("Не удалось открыть файл");  // перейти к обработке ошибки
    int data;
    f >> data;
    f.close ();
}
catch (exception ex) {  // что делать, если ошибка наступила?
    cerr << ex.what () << endl;
}
```

Команда throw является командой безусловного перехода, подобной break, continue, return и goto. Она перемещает управление в определённое место, которое определяется по правилам:
1. Находимся ли мы в блоке try? Если да, попытаться зайти в подходящий catch.
2. Если не было подходящего блока catch, или мы не были в блоке try, то выйти из текущей функции. Оказавшись в новой функции, повторить процедуру с шага 1. Это называется разматыванием стэка.
3. Если мы таким образом вышли из main(), программа завершается аварийно, с так называемым необработанным исключением (unhandled exception).

Помимо этого, команда throw формирует и везёт с собой объект «исключения». В C++ объект исключения может быть вообще любого типа. Его работа — рассказать о состоявшейся ошибке. Этот объект попадёт в переменную ex в примере выше. Поэтому печать ex.what () выведет то сообщение об ошибке, которое мы заложили в момент throw. Это способ транспортировки информации из одного места в другое.
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence