Обработка исключений - строка пропущена, а sqle пуст
IDE = VS7 или 2002
Привет всем, у меня действительно странная проблема здесь. Код не выполняется должным образом. Я запускаю это через отладчик, и он работает очень странно.
Я убедился, что виртуальный каталог использует ASP.NET 1.0.3705.
Код следует, и я объясняю, что отладчик показывает мне как шаги выполнения в комментариях:
try
{
objConnection.Open(); // STARTS HERE
objCommand.ExecuteNonQuery(); // DOES NOT THROW EXCEPTION
int c = 0; // THIS LINE IS EXECUTED
}
catch (SqlException sqle)
{
LogError(); // THIS LINE IS NOT EXECUTED
throw sqle; // THIS LINE IS EXECUTED AFTER THE int c = 0;
// sqle IS NULL
// EXCEPTION IS NOT CAUGHT AND
// EXECUTION CONTINUES IN FINALLY BLOCK
}
finally
{
// EXECUTES AS EXPECTED FROM HERE ON OUT,
// AS THOUGH THE throw sqle; DID NOT HAPPEN.
if (objConnection.State == ConnectionState.Open) objConnection.Close();
}
Кто-нибудь испытывал это странное поведение раньше? Есть идеи как это исправить? Я могу сильно изменить метод, но я все же хотел бы знать, почему это происходит.
Я подозреваю, что поскольку sqle имеет значение null, поэтому throw не работает так, как ожидалось. Но почему мы прыгнули в этот блок кода в первую очередь?
Я перезагружал его несколько раз, сохранял и перестраивал, выполнял с помощью отладчика и несколько раз наблюдал это поведение.
Спасибо за вашу помощь!
Всего наилучшего,
Грэхем
2 ответа
Подождите... ваш код не выдает исключение, и вам интересно, почему он не выполняет блок catch?
РЕДАКТИРОВАТЬ (ссылаясь на ваш комментарий):
В это действительно трудно поверить. Я никогда не слышал о случае, когда фактическое исключение внутри блока catch было нулевым, и, как вы уже упоминали, первая строка внутри блока catch не выполнялась, что, по моему мнению, указывает на то, что исключений вообще не было.
Вы пытались проверить ход программы, используя устаревшие методы отладки (Debug.WriteLine) и пропуская отладчик?
Я предполагаю, что вы смотрите не в том месте, где выдается исключение... или вообще нет исключения.
Очень странно. Я не уверен, что происходит с вашим кодом, но я увидел одну вещь:
catch (SqlException sqle)
{
LogError(); // THIS LINE IS NOT EXECUTED
throw sqle; // THIS LINE IS EXECUTED AFTER THE int c = 0;
// sqle IS NULL
// EXCEPTION IS NOT CAUGHT AND
// EXECUTION CONTINUES IN FINALLY BLOCK
}
Вы хотите написать:
catch (SqlException sqle)
{
LogError();
throw;
}
Перебросить исключение.