2011-12-19 19 views
6

Pewnie czegoś brakuje ... W jaki sposób może zostać zgłoszony wyjątek, ale kod znajdujący się po tym wyjątku wciąż jest trafiony w debugerze?Jak działa kod po wyjątku?

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

Być może złapać wyjątek dalej w górę łańcucha? –

+1

Może szukasz różnych wątków? – Strillo

+0

Czy ten kod jest dostępny z wielu wątków? –

Odpowiedz

5

Niektóre scenariusze, gdzie może to ogólnie zdarzyć:

  • gdy opcja „Wymagaj pliki źródłowe do dokładnie pasuje do oryginalnej wersji” wyłączony. W takim przypadku nie otrzymasz ostrzeżenia, gdy Twoje pliki nie są zsynchronizowane.

  • kiedy IDE prosi o "Wystąpiły błędy kompilacji. Czy chcesz kontynuować i uruchomić ostatnią pomyślną kompilację?", w którym to przypadku IDE może mylić się co do poprawnego wiersza, ponieważ działa wcześniejsza wersja.

  • podczas debugowania wersji Release Twojego kodu, w której niektóre części są zoptymalizowane. Powoduje to, że podświetlona linia jest następną dostępną linią w źródle, która odzwierciedla rzeczywistą instrukcję w zoptymalizowanym kodzie (często będzie to widoczne podczas optymalizacji debugowania z zewnętrznymi złożeniami).


EDIT: I niby-of misread kodu. Pomiędzy "rzutem" a linią, która zostanie podświetlona, ​​jest tylko deklaracja zmiennej, bez kodu do wykonania. Zakładam, że miałeś na myśli to, że kod "używając ..." został podświetlony? Ponieważ jest to zgodne z oczekiwaniami: jest to pierwsza linia po instrukcji throw (instrukcja throw sama nie "złapie" błędu dla debuggera).

patrz obrazek: enter image description here

+1

"Wymagaj plików źródłowych ..." jest zaznaczone. Ponadto nie ma błędów kompilacji. Nie debuguję wersji Release. To skończy się być czymś głupim, gdzie powinienem był wiedzieć, ale teraz utknąłem. –

+0

Dzięki, Abel. Spodziewałem się, że blok catch będzie kolejną linią pokazaną po uderzeniu F10 na wyciągu. Tak jak powiedział Marc, może to tylko IDE z linii. Mój wyjątek wygląda dokładnie tak, jak pokazano powyżej. Po tym, jak uderzę F10 po tym punkcie, trafiam poprawnie do bloku catch. –

+0

Dokładnie. Dziękuję Ci. –