VS2010: предупреждение анализа кода CA2000.Объект расположен не по всем путям исключений - PullRequest
1 голос
/ 07 февраля 2011

В целях создания хорошего кода я проверил свой проект в Visual Studio 2010 с помощью «Выполнить анализ кода».В приведенной ниже функции я получаю следующее предупреждение, которое я не понимаю, потому что единственная строка, которая может генерировать исключение, является sqlC.ExecuteNonQuery () , с only типом исключения " SQLException".

CA2000: Microsoft.Reliability: В методе« Company.log (строка, строка, DateTime, DateTime, строка, bool) »объект« sqlC »не удаляетсявдоль всех путей исключения.Вызовите System.IDisposable.Dispose для объекта 'sqlC' до того, как все ссылки на него выйдут из области видимости.

Почему Анализ жалуется?Любая помощь очень ценится!

    private void log(string type, string descr, DateTime start, DateTime end, string msg, bool success)
    {
        SqlCommand sqlC = new SqlCommand();
        sqlC.CommandType = CommandType.Text;
        sqlC.Connection = sc;
        sqlC.CommandText = "INSERT INTO [cap_jobHistoryDetails] (...) VALUES(...)";
        sqlC.Parameters.AddWithValue("@jobID", _job_id.ToString("d", CultureInfo.InvariantCulture));
        sqlC.Parameters.AddWithValue("@type", type);
        sqlC.Parameters.AddWithValue("@start", start);
        sqlC.Parameters.AddWithValue("@end", end);
        sqlC.Parameters.AddWithValue("@descr", descr);
        sqlC.Parameters.AddWithValue("@msg", msg);
        sqlC.Parameters.AddWithValue("@success", (success ? "1" : "0"));

        try
        {
            sqlC.ExecuteNonQuery();
        }
        catch (SqlException)
        {
            sqlC.Dispose();
            throw;
        }
        sqlC.Dispose();
    }

Ответы [ 2 ]

7 голосов
/ 07 февраля 2011

Перейти читать о using блоков

Этот код станет короче и правильнее, если написать с помощью using.

Существует несколько способов исключения из функции без правильного удаления sqlC. .NET использует полусинхронную модель исключений, и фактически ЛЮБОЙ ряд управляемого кода может выдать (например, исключение ThreadAborted). Или sqlC.ExecuteNonQuery() может вызвать исключение другого типа.

2 голосов
/ 07 февраля 2011

Учитывая, что вы перехватываете только одно исключение (и даже потом перебрасываете его) - в случае любого исключения ничего после того, как ваш блок try / catch будет выполнен Исключения прерывают нормальный поток, поэтому после исключения ничего не выполняется. (Если только он не находится в блоке catch для правильного типа исключения или в блоке finally ...)

Если вы хотите, чтобы код всегда выполнялся после попытки / перехвата, используйте finally в конце блока.

Но в случае IDisposable объектов, блоки using обрабатывают это для вас, как говорит Бен Фойгт.

...