2011-01-30 18 views

Odpowiedz

0

Jest to normalne zachowanie. Być może chcesz uchwycić wyjątek, aby uniemożliwić zamknięcie aplikacji.

1

Jest to normalne zachowanie CLR z wersji 2.0. Oto post na ten temat w MSDN. Aby uniknąć przerwania procesu, można użyć czegoś podobnego do tego, co nie jest zalecane.

4

Twoim oczekiwanym zachowaniem było zachowanie z powrotem w wersji 1.1. Ogólnie uważano, że był to zły pomysł. Jeśli w dowolnym wątku jest nieobsługiwany wyjątek, proces może zostać pozostawiony w niespójnym stanie. Aktualizacje udostępnionych danych mogą być częściowo zastosowane itd. Środowisko wykonawcze nie ma informacji umożliwiających bezpieczne obsłużenie tego scenariusza lub nawet wiedzieć, jak chcesz obsłużyć ten scenariusz, więc jego wybór byłby równoznaczny z przerwaniem wątku i pozostawieniem twojego programu w dziwny stan. Może to prowadzić do przecieku zasobów, zawieszeń, uszkodzenia danych, itp. Poprzez zakończenie procesu z nieobsługiwanym wyjątkiem wiesz dokładnie, co się dzieje, proces się kończy.

7

Domyślnym zachowaniem w aplikacjach .NET jest wyjście w przypadku wystąpienia nieobsługiwanego wyjątku. Gdy wyjątek nie jest obsługiwany, program znajduje się w nieznanym i prawdopodobnie niestabilnym stanie. To, że wydarzyło się w tle, nie oznacza, że ​​błąd nie wpłynie na resztę programu. Najbardziej rozważnym kursem dla środowiska wykonawczego w tej sytuacji jest zrzucenie programu.

Możesz zajrzeć do AppDomain.CurrentDomain.UnhandledException, która pozwoli Ci złapać nieobsługiwane wyjątki i odpowiednio zareagować. Lepszym rozwiązaniem jest zawarcie procesu wątku za pomocą try...catch. Ale tylko on radzi sobie z tymi wyjątkami, które wie, jak sobie z tym poradzić. W ten sposób:

void MyThreadProc() 
{ 
    try 
    { 
     // ... 
    } 
    catch 
    { 
     // handle all exceptions 
     // This is a BAD idea 
    } 
} 

jest naprawdę zły pomysł, ponieważ może maskować wyjątki, które naprawdę chcą być propagowane do programu głównego.

Powiązane problemy