2012-06-20 12 views
38

Otrzymuję taki problem w debugerze i program przestaje wykonywać. Debugger nie pokazuje mi linii, więc nie wiem, co naprawić.jak naprawić "System.AggregateException" wystąpił w mscorlib.dll "

nieobsługiwany wyjątek typu „System.AggregateException” w module mscorlib.dll

dodatkowe: wyjątek (e) to zadanie nie zaobserwowano ani czekając na zadania lub umożliwia jego własności wyjątku . Jako wynik , niedostrzeżony wyjątek został ponownie zgłoszony przez wątek finalizatora.

Nie można uzyskać wartość lokalnego lub argumentu „”, ponieważ nie do dyspozycji wskaźnik instrukcji, prawdopodobnie dlatego, że został zoptymalizowane z dala. System.Threading.Tasks.TaskExceptionHolder

Jak rozwiązać mój problem?

znalazłem też to pytanie, które jest bardzo podobne Cannot obtain value of local or argument as it is not available at this instruction pointer, possibly because it has been optimized away

+0

W jakiś sposób spowodowałem ten problem, gdy poprzednia bezproblemowa aplikacja konsolowa została przerwana podczas przebiegu debugowania. Zamknięcie Visual Studio, a następnie ponowne otwarcie go rozwiązało problem, a następnie przebiegło pomyślnie - to nie pomoże we wszystkich przypadkach, ale warto spróbować, jeśli aplikacja "powinna" działać poprawnie. –

Odpowiedz

42

Jak mówi komunikat, masz zadanie, które rzucił nieobsługiwany wyjątek.

Włącz opcję Przerwij we wszystkich wyjątkach (debugowanie, wyjątki) i ponownie uruchom program.
To pokaże oryginalny wyjątek, kiedy został zgłoszony w pierwszej kolejności.


(komentarz dołączony): W VS2015 (lub nowszym). Wybierz opcję Debugowanie> Opcje> Debugowanie> Ogólne i odznacz opcję "Włącz tylko mój kod".

+2

Gdzie jest to ustawienie? Debugowanie> Wyjątki> ...? – mdupls

+3

@mdupls: Przerwij wszystkie wyjątki CLR. – SLaks

+1

po prostu sprawdź wszystkie. Następnie użyj "Resetuj wszystko", aby powrócić do wartości domyślnych. –

9

Możesz obsłużyć wyjątek bezpośrednio, aby nie zawiesić programu (przechwycenie AggregateException). Można też spojrzeć na wyjątek wewnętrzny, to daje bardziej szczegółowe wyjaśnienie co poszło źle:

try { 
    // your code 
} catch (AggregateException e) { 

} 
+2

Ale jak rozwiązać problem na pewno? –

+0

Generalnie chcesz, aby aplikacja uległa awarii, jeśli coś poszło nie tak. Zaadresuj źródło problemu zamiast przechwytywać wszystkie wyjątki. –

4

Zaakceptowanych odpowiedź będzie działać, jeśli można łatwo odtworzyć problem. Jednakże, w ramach najlepszej praktyki, powinieneś wychwycić wszelkie wyjątki (i rejestrowanie), które są wykonywane w ramach zadania. W przeciwnym razie aplikacja ulegnie awarii, jeśli wystąpi coś nieoczekiwanego w ramach zadania.

Task.Factory.StartNew(x=> 
    throw new Exception("I didn't account for this"); 
) 

Jednak jeśli to zrobimy, przynajmniej aplikacja się nie zawiesza.

Task.Factory.StartNew(x=> 
    try { 
     throw new Exception("I didn't account for this"); 
    } 
    catch(Exception ex) { 
     //Log ex 
    } 
) 
0

W moim przypadku wpadłem na ten problem podczas korzystania Edge.js - cały problem był błąd składni JavaScript wewnątrz definicji funkcji C# Edge.js.