Co to jest „wyjątek pierwszej szansy”?


Odpowiedzi:


78

To koncepcja debugowania. Zasadniczo wyjątki są wysyłane najpierw do debugera, a następnie do rzeczywistego programu, gdzie jeśli nie są obsługiwane, są wysyłane do debugera po raz drugi , dając ci szansę zrobienia czegoś z nim w swoim IDE przed i po samej aplikacji. Wygląda na to, że jest to wynalazek Microsoft Visual Studio.


21
To więcej niż koncepcja debugowania; Język C # nie zapewnia wygodnego sposobu obserwacji obsługi wyjątków dwuprzebiegowych w czasie wykonywania, ale vb.net to robi. Zasadniczo, gdy zostanie zgłoszony wyjątek, czas wykonywania rozpoczyna się od przeszukania stosu wywołań, aby dowiedzieć się, kto, jeśli ktoś go złapie. Ten proces ma miejsce przedfinally uruchomieniem jakichkolwiek bloków. Gdy system zdecyduje, kto złapie wyjątek (i określi, że ktoś rzeczywiście to zrobi), rozpocznie rozwijanie stosu. Zauważ, że jeśli wyjątek zostanie wyrzucony z finallybloku ...
supercat

18
... kod, który spodziewał się złapać oryginalny wyjątek, może w końcu tego nie robić; istnieje wiele dziwnych przypadków narożnych.
supercat

5
Dzieje się tak, gdy debugger został skonfigurowany tak, aby przerywał wszystkie zgłaszane wyjątki (nie tylko nieobsłużone wyjątki) lub gdy „wkraczasz” do jakiejś instrukcji, która jest zgłaszana. Zostanie wyświetlony komunikat W pliku YourApp.exe wystąpił wyjątek pierwszej szansy typu „foo” . Nadal możesz kontynuować (F5) lub pójść dalej (F11). Więc jeśli jest catchna to, kontrola idzie tam. Jeśli nie ma catchbloku, pojawia się przerwa „drugiej szansy”, tym razem komunikat jest Nieobsłużony wyjątek typu „foo” wystąpił w pliku YourApp.exe . Od tego momentu próba kontynuowania lub pójścia dalej nie powiedzie się.
Jeppe Stig Nielsen

@supercat: Jak poznam szczegóły, o których wspomniałeś w swoich komentarzach powyżej? Czy jest to wynik eksperymentowania na sobie? czytanie książek (która)? To bardzo imponujące spostrzeżenie! Byłbym wdzięczny, gdybyś mógł poświęcić chwilę, aby odpowiedzieć na to pytanie ...
anish

2
@NoSaidTheCompiler: Czytałem o obsłudze wyjątków na różnych blogach; Spodziewałbym się, że wyszukanie hasła „filtr wyjątków .net” powinno spowodować pojawienie się niektórych blogów na ten temat.
supercat


4

Właśnie zacząłem używać debuggera i wpadłem na to. Podczas moich badań znalazłem wpis na blogu MSDN Co to jest wyjątek pierwszej szansy? to wyjaśniło to dla mnie.

Najważniejsze wnioski z tego posta na blogu są takie, że odnosi się on do powiadomienia debuggera, a nie do czegoś, co mój kod musiałby koniecznie obsługiwać, a co najważniejsze: „Komunikaty o wyjątkach pierwszej szansy najczęściej nie oznaczają, że jest problem w kod."


Proszę zamieścić fragment ( nie cały artykuł ) tego, co okazało się pomocne, korzystając z tego linku. Była wcześniejsza odpowiedź zawierająca tylko łącze z tym samym łączem, który został usunięty.
Mark Hall,

Najważniejsze dla mnie jest to, że odnosi się do powiadomienia do debugera, a nie do czegoś, co mój kod musiałby koniecznie obsługiwać, a co najważniejsze: „Komunikaty o wyjątkach pierwszej szansy najczęściej nie oznaczają, że w kodzie jest problem”.
kodowanie w lipcu

Dodałem Twój komentarz do Twojej odpowiedzi, czuję, że link jest na tyle ważny, aby go zachować, staram się upewnić, że nie będzie traktowany jako jedyna odpowiedź, tak jak poprzednio, kiedy został podany.
Mark Hall

0

Kiedy aplikacja jest debugowana, debugger jest powiadamiany o każdym napotkaniu wyjątku. W tym momencie aplikacja zostaje zawieszona, a debugger decyduje, jak obsłużyć wyjątek. Pierwsze przejście przez ten mechanizm nazywa się wyjątkiem „pierwszej szansy”.

W zależności od konfiguracji debugera albo wznowi aplikację i przekaże wyjątek, albo pozostawi aplikację zawieszoną i przejdzie w tryb debugowania. Jeśli aplikacja obsługuje wyjątek, nadal działa normalnie.

Komunikaty o wyjątkach pierwszej szansy najczęściej nie oznaczają, że w kodzie jest problem. W przypadku aplikacji / komponentów, które z wdziękiem obsługują wyjątki, komunikaty o wyjątkach pierwszej szansy informują programistę, że napotkano wyjątkową sytuację i została ona obsłużona.


0

Z punktu widzenia programisty bardziej dotyczy to wyjątku drugiej szansy, ponieważ oznaczałoby to, że nie został on obsłużony w kodzie ; dlatego aplikacja zostanie zatrzymana.

Pierwsza szansa może być wielu z nich, ale te, o które należy się martwić, znowu, z punktu widzenia programowania, to druga szansa, ponieważ doprowadziłoby to do awarii aplikacji.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.