﻿# V2673\. MISRA\. An empty throw should only occur within the compound\-statement of a catch handler\.

Диагностическое правило основано на руководстве [MISRA](https://misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Правило актуально только для C\+\+\.

Анализатор обнаружил, что `throw`\-выражение не имеет операнда \(проброс активного исключения\) и не находится внутри `catch`\-блока\. Такой код может являться ошибочным\. Нахождение конструкции `throw;` вне явных синтаксических границ обработчика `catch` сигнализирует о высокой вероятности дефекта\. Если этот код выполнится в тот момент, когда в программе нет активного исключения, это приведёт к вызову [`std::terminate`](https://timsong-cpp.github.io/cppwp/n4950/except.terminate#1.8) и аварийному завершению работы программы\.

Рассмотрим пример некорректного кода:

```cpp
try
{
  if (ok)
    return ....;

  throw;
}
catch (...)
{
}
```

В данном примере `throw`\-выражение исполняется внутри блока `try`, где ещё нет пойманного исключения\. Так как объект исключения для проброса отсутствует, выполнение этого кода приведёт к вызову `std::terminate`\.

Корректный вариант кода:

```cpp
try
{
  if (ok)
    return ...;

  throw some_exception(....);
}
catch (...)
{
}
```