2013-06-04 4 views
11

Mam następujący kod:Zatrzymaj visual studio z zerwania na wyjątku Zadania

Task load = Task.Factory.StartNew(() => {//Some Stuff Which Throws an Exception}); 

try 
{ 
    load.Wait(); 
} 
catch (AggregateException ex) 
{ 
    MessageBox.Show("Error!"); 
} 

Gdy kiedykolwiek jest wyjątek w zadaniu, chcę go do bańki się złapać w połowu try zamiast wizualny rozbicie studia w punkcie, z którego wynika wyjątek.

Próbowałem google a niektórzy sugerują, dodam to [DebuggerHidden] na szczycie mojej metody, ale to nie działa

+0

Och, człowieku, to tak mnie zdezorientowało. Myślałem, że mój wyjątek nie zostanie w ogóle złapany, ale automatyczne łamanie jest po prostu przedwczesne i może być kontynuowane. Naprawdę wygląda na bardzo złe domyślne zachowanie. Komunikat o błędzie wydaje się rażąco błędny, ponieważ twierdzi, że wyjątek był nieprzechwycony, ale kontynuacja spowoduje, że zostanie on złapany całkowicie dobrze. – Kat

Odpowiedz

22

OK Dowiedziałem się, jak to zrobić. Odpowiedź jest prawo here w sekcji uwaga

Kiedy „Just My Code” jest włączona, Visual Studio, w niektórych przypadkach nie złamie się na linii, która zgłasza wyjątek i wyświetla komunikat o błędzie „wyjątek nie obsługiwane przez kod użytkownika." Ten błąd jest łagodny. Możesz nacisnąć klawisz F5, aby kontynuować i zobaczyć zachowanie związane z obsługą wyjątków, które zostało zademonstrowane w tych przykładach. Aby uniemożliwić programowi Visual Studio złamanie pierwszego błędu, odznacz pole wyboru Włącz tylko mój kod w obszarze Narzędzia, Opcje, Usuwanie błędów, Ogólne.

0

Aby wyłączyć ogranicznik na wyjątki naciśnij „Ctrl + Alt + E”. Spowoduje to otwarcie okna Wyjątki. Usuń zaznaczenie "Wyjątki dla środowiska wykonawczego języka wspólnego - odrzucane".

+1

To uniemożliwiłoby mu wstrzymanie się z wewnątrz delegata, ale nie było, gdy zostało ono ponownie wydane na 'Czekaj'. – Servy

6

Z punktu widzenia VS tak naprawdę nie ma różnicy między wyjątkiem, który jest wysyłany z delegowania do zadania z dowolnego innego wyjątku.

Nie ma sposobu, aby rozwiązać ten problem w ogólnym przypadku.

Jednak jedyną rzeczą, którą można zrobić, to wykorzystać fakt, że po ponownym wygenerowaniu wyjątku jest on zawijany w AggregateException. Możesz przerwać wywoływanie AggregateException, ale nie w innych wyjątkach.

Możesz przejść do Debug -> Wyjątki, odznacz wszystkie wyjątki CLR, ale potem ponownie włączyć zagregowane wyjątki:

enter image description here

To teraz nie zatrzyma się w organizmie Task ale zatrzyma debugera gdy jest dzwonisz pod numer Wait.

Niefortunnym efektem ubocznym jest to, że nie będziesz już wstrzymywał się na żadne inne wyjątki w żadnym innym miejscu w programie, nawet jeśli nie należą do delegata przekazanego do Task.

+0

No cóż, to niefortunne, ale źle to przeżyje. Dzięki za odpowiedź! – Krimson

Powiązane problemy