# V3226. Potential resource leak. The disposing method will not be called if an exception occurs in the 'try' block. Consider calling it in the 'finally' block.

Анализатор обнаружил освобождение неуправляемого ресурса, которое может не произойти из-за выброшенного исключения.

Пример:

    public void ProcessStreamReader(....)
    {
      StreamReader sr = null;

      try
      {
        sr = new StreamReader(Console.OpenStandardInput(), Encoding.UTF8);

        string readString = sr.ReadLine();

        IO.WriteLine(readString);

        sr.Close();
      }
      catch (IOException exceptIO)
      {
        Console.WriteLine(exceptIO);
      }
    }

В данном случае разработчик хотел вызвать метод `Close` для освобождения ресурсов, которые использует объект. Если в блоке `try` будет выброшено исключение, то метод не отработает, и ресурс не будет очищен.

Исправленный код может выглядеть следующим образом:

    public void ProcessStreamReader(....)
    {
      StreamReader sr = null;

      try
      {
        sr = new StreamReader(Console.OpenStandardInput(), Encoding.UTF8);

        string readString = sr.ReadLine();

        IO.WriteLine(readString);

        sr.Close();
      }
      catch (IOException exceptIO)
      {
        Console.WriteLine(exceptIO);
      }
      finally
      {
        if (sr != null)
        {
          sr.Close()
        }
      }
    }

В исправленном варианте метод `Close` вызывается в блоке `finally`, поэтому метод будет вызван даже если в блоке `try` будет выброшено исключение.

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки утечек памяти, незакрытых файловых дескрипторов и дескрипторов сетевых соединений [* см. примечание касательно языков C#, Java].

Данная диагностика классифицируется как:

CWE-404