2011-12-19 2 views
6

Мне что-то не хватает ... Как можно исключить исключение, но код, следующий за исключением, все еще попадает в отладчик?Как выполняется код после исключения?

private UpdaterManifest GetUpdaterManifest() 
{ 
    string filePathAndName = Path.Combine(this._sourceBinaryPath, this._appName + ".UpdaterManifest"); 

    if (!File.Exists(filePathAndName)) 
    { 
     // This line of code gets executed: 
     throw new FileNotFoundException("The updater manifest file was not found. This file is necessary for the program to run.", filePathAndName); 
    } 

    UpdaterManifest updaterManifest; 

    using (FileStream fileStream = new FileStream(filePathAndName, FileMode.Open)) 
    { 
     // ... so how is it that the debugger stops here and the call stack shows 
     // this line of code as the current line? How can we throw an exception 
     // above and still get here? 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(UpdaterManifest)); 
     updaterManifest = xmlSerializer.Deserialize(fileStream) as UpdaterManifest; 
    } 

    return updaterManifest; 
} 
+1

Возможно, вы ловите исключение дальше по цепочке? –

+1

Возможно, вы просматриваете разные темы? – Strillo

+0

Доступен ли этот код из нескольких потоков? –

ответ

5

Некоторые сценарии, где это может вообще случиться:

  • когда опция «Требовать исходные файлы для точного соответствия исходной версии» выключен. В этом случае вы не получите предупреждение, когда ваши файлы не синхронизированы.

  • , когда IDE запрашивает «Были ошибки сборки. Хотели бы вы продолжить и запустить последнюю успешную сборку?», и в этом случае IDE может ошибаться в правильной строке, поскольку она запускает более раннюю версию.

  • при отладке выпускной версии вашего кода, где определенные части оптимизированы. Это приводит к тому, что выделенная строка будет следующей доступной строкой в ​​источнике, которая отражает и фактическую инструкцию в оптимизированном коде (это вы часто увидите при отладке с оптимизированными внешними сборками).


EDIT: Я добрейший из неправильно кода. Между «броском» и выделенной линией, есть только объявление переменной, никакого кода вообще не должно выполняться. Я предполагаю, что вы имели в виду, что код «using ...» был выделен? Потому что это так, как ожидалось: это первая строка после оператора throw (сам оператор throw не «улавливает» ошибку для отладчика).

Смотрите скриншот: enter image description here

+1

«Требовать исходные файлы ...». Кроме того, ошибок сборки нет. Я не отлаживаю версию Release. Это будет в конечном итоге чем-то глупо, где я должен был знать, но сейчас я застрял. –

+0

Спасибо, Абель. Я ожидал, что блок catch станет следующей строкой, показанной при нажатии F10 на оператор throw. Как сказал Марк, может быть, это просто IDE, находящаяся на линии. Мое исключение выглядит точно так, как вы показали выше. Как только я ударил F10 после этой точки, я правильно доставлен в блок catch. –

+0

Точно. Спасибо. –

Смежные вопросы