Table of Contents
Zaktualizowano
Jeśli faktycznie napotykasz nowy błąd .net, ten przewodnik powinien pomóc.Jeśli blok natrafienia nie obsługuje konkretnego wyjątku, który zapewnia do przechwycenia, możesz ponownie zgłosić inny. Wyrażenie rethrow (throw musi mieć wyrażenie motywu) powoduje, że oryginalnie uruchomiony model zostanie wygenerowany.
rzucać wyjątki des Rethrow encore pokazuje, z tym wyjątkiem, że komentarz throw jest wywoływany bez czegokolwiek innego niż obiekt, jak wewnątrz nowego bloku get on. Można się nim cieszyć tylko w bloku przechwytującym. Notatka
Co to jest wyjątek Rethrow w C#?
Jeśli zostanie złapany wyjątek, możemy osiągnąć pewne rzeczy, takie jak rejestrowanie określonego błędu, nie wspominając, a następnie ponowne zgłaszanie innych. Ponowne zgłoszenie wyjątku oznacza telefonowanie instrukcji throw bez elementu wyjątku w bloku catch. Można go było spożyć tylko w bloku wykrywania.
Kilka dni temu natknąłem się na C#, ładny kod, który rzuca doskonały wyjątek, w zasadzie oznacza, że przechwycony obiekt wykluczenia, który przekazuję, to argument słowa kluczowego throw to Ex ; ) throw (. Ten wzorzec ponownego generowania może być przygotowany jako ćwiczenie w rozwiązywaniu problemów z tworzeniem gier, bardzo często kojarzone z „Znajdywaniem miejsca, w którym występuje wyjątek” .i .nie jest .zawsze .najbardziej . zabawa .na rynku .granie .więcej .niż kiedykolwiek .kiedy .wystarczy .duży .kod, ..właściwy .najlepszy . sposób, który .dostanie .wyjątek .w .sieci . uruchom ponownie.
zrobiłbym
Dlaczego nie zrezygnuj
Załóżmy, że natkną się na kod, który to robi, przechwytując wyjątek od tego (wiersz 21), zapisując żądane sekcje (wiersz 23), ponownie zgłaszając wyjątek (wiersz 24), a następnie przenosząc stos śledzenia z dala od ponownego uruchomienia . Główna metoda (wiersz 11) zgłasza wyjątek, dzięki czemu możesz konsola.
Wł. w rzeczywistości może być zaskakująco ładna. Patrząc na typ wyjścia, wygląda na to, że wyjątek został dobrze wychwycony w 24. wątku Will samej metody dosomeusefulwork
. Po prostu otrzymuje strategię icanthroweException
symbolu lub rodzaju, która wspomina, że problem nigdy nie został wywołany. To jest prosta instancja, możesz szybko zrozumieć, co naprawdę się wydarzyło, pamiętaj, ale wyobraź sobie, że gdyby był to prawdziwy kod produktu programów komputerowych z setkami linii osądu, kosztowałoby to dużo, a może nawet niemożliwe. aby w pełni uzyskać łańcuch odcinków prowadzący do każdego wyjątku.
Ale dlaczego
czy dzieje się coś podobnego? Cóż, C#, jeśli chcesz po drodze zgłosić wyjątek, musisz sam przekazać aktualnie obiekt wyjątku. Można to zrobić po prostu tworząc nową instancję klasy reprezentującą wielokropek New Exception() throw (linia 30). Jest to krok dla kompilatora C#, który reprezentuje to samo, co robisz podczas innowacyjnego tworzenia nowego obiektu lub wyjątków, które wykonujesz, gdy przekazujesz już istniejący obiekt. Można to zademonstrować za pomocą aktualnie wygenerowanego kodu z przykładu. Oto dowolny kod IL dla metody:
Lekcja 9 tworzy icanthroweException
plik jest nową instancją jednej konkretnej klasy wyjątku i umieszcza zasób szkoleniowy na stosie. Wiersz Exception 8 używa tego polecenia wywołania throw
.
Widać, że w bloku catch, metoda dosomeusefulwork
jest prawie identyczna, jeśli chodzi o rzucanie silnego wyjątku:
Jak sprawić, by I Rethrow przechwycił wyjątek w C#?
Wyjątek związany z problemem może zostać zgłoszony ponownie, więc produkt może zostać złapany przez apelację zewnętrzną. Aby zgłosić wyjątek na new, wystarczy włączyć bez określania wyrażenia.
Tutaj, przy wyborze 3 polecenia stloc.Grocery 0
, wyjątek od tej reguły odnosi się do lokalnej elastycznej linii w zdanie 8 ldloc.0
, zasób jest przesuwany w górę stosu. użycie z poleceniem throw
odpowiedniego rzutu jest wyjątkiem od tej reguły. W obiekcie ICanThrowException
nowe wystąpienie jest formułowane w wyjątku, a szkoła clr wygodnie wypełnia zagnieżdżenie śladu stosu tym wyjątkiem. Ale teraz w sieci blokowej DoSomeUsefulWork
to polecenie throw
jest używane w tej samej strategii, a clr zresetuje właściwości śledzenia stosu, które odnoszą się do wyjątku przekazanego do aktualnie < code>throw tak, jakby był to nowy wyjątek typu new, utworzony tutaj, aby wyglądał, jakby mógł zostać zgłoszony jako wyjątek, jak wyszczególniono w samym bloku.
dość
Aby „zakończyć”
Najbardziej
Podstawowym sposobem na zgłoszenie wyjątku recharacter bez obalania oryginalnego wyszukiwania stosu jest po prostu spełnienie połączenia throw
z wyjątkiem obiektu. Oto wspomniana metoda DoSomeUsefulWork
, która właśnie kończy throw
:
co on
Czym zazwyczaj jest Rethrow?
Przefiltrowany. (kalkulacja) Zorganizuj (wyeliminuj) ponownie.
Zauważ, że w tym miejscu nie ma problemów z kursem 11 run
. Oto wynik działania programu with:
Zaktualizowano
Czy masz dość powolnego działania komputera? Denerwują Cię frustrujące komunikaty o błędach? ASR Pro to rozwiązanie dla Ciebie! Nasze zalecane narzędzie szybko zdiagnozuje i naprawi problemy z systemem Windows, jednocześnie znacznie zwiększając wydajność systemu. Więc nie czekaj dłużej, pobierz ASR Pro już dziś!
Ma to o wiele więcej sensu, teraz jest bardzo jasne, że wyjątek wystąpił w kolejce 30 produktu ICanThrowException
i linii 20 jednego z Metody DoSomeUsefulWork
zostały w zasadzie aktywowane. Ponownie. Zmiana działa również w kodzie want il
linia
Czym jest bez wątpienia wyjątek Rethrow?
Jeśli metoda bez catch-deter może utrzymać konkretny wyjątek, może go ponownie zgłosić. (rethrow-expression heave bez Assignment_expression) powoduje ponowne utworzenie początku wszystkich obiektów rzutu.
W którym 8, rethrow
jest uważane za używane zamiast throw
. To niestety pozostaje pierwotną lokalizacją, ale wszystko ma swoje wady.
Przechwytywanie
Przy uruchomieniu
Prawdą jest, że kto throw
przechowuje szczegółowe informacje o tym, gdzie rzucił, drugi był, z wyjątkiem tego, że nadal nie daje pełnego wyobrażenia o tym, co rzucił z czego. Uwaga, publiczność mogła zauważyć, że metoda w dosomeusefulwork
w rzeczywistości zawiera więcej niż dwa wywołania wszystkich metod ICanThrowException
. Nigdy nie można sobie wyobrazić, że eksperci twierdzą, że DoSomeUsefulWork
jest dość złożoną metodą z szerokim zakresem instrukcji if
, z których każdy może być wywołany w ICanThrowException
. Teraz samo pytanie brzmi, co niestety polecacie do wyłączeń? throw
nie może udzielić odpowiedzi. W typowym poprzednim przykładzie jedyna wzmianka o typie metody DoSomeUsefulWork
była w linii 24, gdzie wszystko zostało wygenerowane.Nie jest jasne, czy wyjątek jest zwykle w linii 18 czy w linii 19 (patrz prawa przykład). .Net Framework 4.5 wprowadził podział ExceptionDispatchInfo, który może rozwiązać ten problem. Planuje się, że będzie używany przez TPL, w szczególności wybory, jako przewodnik korzystania z zestawów kluczy await
z niezagregowanymi wyjątkami. ale ponieważ jest to zwykle publiczna klasa aplikacji, może być wykorzystana do ponownego zgłoszenia nawet wyjątków TPL bez niej. Tak to wygląda w kodzie):
20 (linia
Działa, najpierw pobierając wyjątek, a następnie ponownie go podnosząc. W rzeczywistości jest to wynik samego programu:
Jak cieszę się, że I Rethrow przechwycił wyjątek w C#?
Użyj throw, aby ponownie zgłosić wyjątek. zamiast rzucać dokładnie to, co
To nie jest dużo lepsze, mówi tylko, skąd pochodzi cały wyjątek i gdzie został usunięty, ale pokazuje również pełny łańcuch połączony wywołania, które doprowadziły Cię do wyjątku, co znacznie ułatwia zrozumienie zarejestrowanego wyjątku. aby dowiedzieć się, gdzie i dlaczego pojawił się nowy problem. Wewnętrzne elementy ExceptionDispatchInfo są często dość proste, jak
Czy mam ponownie zgłaszać wyjątki?
jeśli stanie się nowy, w którym blok catch nie może prawidłowo obsłużyć upuszczania, instrukcja throw musi zostać ponownie uruchomiona z każdym wyjątkiem o wartości null. Niezależnie od tego, czy zgłaszasz ten sam wyjątek, czy zamykasz konkretny, ogólne pojazdy mają ominąć komunikat o wyjątku lub ten popularny stos wywołań dziennika poniżej.
Rethrow Error .net
Relanzar Error .net
Rethrow Error .net
Rethrow-Fehler .net
Errore Di Rilancio .net
Повторить ошибку .net
Relancer L'erreur .net
오류 .net 다시 던지기
Rethrow-fout .net
Erro De Relançamento .net