Try-catch ma na celu pomóc w obsłudze wyjątków. To w jakiś sposób pomoże naszemu systemowi stać się bardziej niezawodnym: spróbuj odzyskać dane z nieoczekiwanego zdarzenia.
Podejrzewamy, że coś może się wydarzyć podczas wykonywania instrukcji i (wysyłania wiadomości), więc zostaje to uwzględnione podczas próby. Jeśli wydarzy się coś prawie nieoczekiwanego, możemy coś zrobić: zapisujemy haczyk. Nie sądzę, że zadzwoniliśmy, aby po prostu zarejestrować wyjątek. Wydaje mi się, że blok catch ma dać nam szansę na wyleczenie z błędu.
Teraz załóżmy, że usuwamy błąd, ponieważ możemy naprawić to, co jest nie tak. Ponownie spróbuj ponownie:
try{ some_instruction(); }
catch (NearlyUnexpectedException e){
fix_the_problem();
retry;
}
Szybko wpadłoby to w wieczną pętlę, ale powiedzmy, że fix_the_problem zwraca true, a następnie ponawiamy próbę. Biorąc pod uwagę, że nie ma czegoś takiego w Javie, w jaki sposób rozwiążesz ten problem? Jaki byłby twój najlepszy kod do rozwiązania tego problemu?
To jest pytanie filozoficzne, biorąc pod uwagę, że już wiem, o co pytam, nie jest bezpośrednio wspierane przez Javę.
źródło
remove()
od tegojava.util.Queue
, który przeskakuje iInvalidElementException
kiedy kolejka jest pusta. Zamiast pytać, czy jest pusty, zbieram akcje w try-catch (co w przypadku współbieżności staje się obowiązkowe nawet w przypadku poprzedniego, jeśli). W takim przypadku wcatch
bloku poprosiłbym o uzupełnienie kolejki o więcej elementów, a następnie ponowienie próby. VoilaOdpowiedzi:
Musisz zamknąć swoją
try-catch
wewnętrznąwhile
pętlę w następujący sposób: -Wziąłem
count
imaxTries
unikam wpadania w nieskończoną pętlę, na wypadek, gdyby wyjątek nadal występował w twoimtry block
.źródło
maxTries
. W przeciwnym razie zostanie on napotkany,infinite loop
jeśli użytkownik będzie ciągle podawał nieprawidłowe dane wejściowe, a zatem nie wyjdzie. Nie ma za co. :)Obowiązkowe rozwiązanie „przedsiębiorczości”:
I zadzwonić:
źródło
Jak zwykle najlepszy projekt zależy od konkretnych okoliczności. Zazwyczaj jednak piszę coś takiego:
źródło
continue
jest to potrzebne. Możesz po prostu odwrócić warunek if.Chociaż
try/catch
wwhile
to dobrze znana i dobra strategia, chcę zaproponować Ci rekurencyjne połączenie:źródło
limit
liczyłoby to na powtórzenie metody? W przeciwieństwie do wersji pętli, która będzie rzucać na poziomie „oryginalnym” ...void retry(int times) { (...) if (times==0) throw w; retry(times--);
Dokładny scenariusz obsługiwany przez Failsafe :
Dość proste.
źródło
Możesz używać adnotacji AOP i Java z aspektów jcabi (jestem programistą):
Możesz także użyć
@Loggable
i@LogException
adnotacji.źródło
fix_the_problem();
w bloku catchWiększość tych odpowiedzi jest zasadniczo taka sama. Mój też jest, ale to jest forma, którą lubię
źródło
fix_the_problem
po ostatniej próbie. To może być kosztowna operacja i może zmarnować trochę czasu.if (tryCount < max) fix()
- ale jest to format ogólnego podejścia; szczegóły zależą od konkretnego przypadku. Jest też Retryer na bazie guawy, na który patrzyłem.Wiosenne AOP i rozwiązanie oparte na adnotacjach:
Użycie (
@RetryOperation
to nasza niestandardowa adnotacja do zadania):Będziemy potrzebować dwóch rzeczy, aby to osiągnąć: 1. interfejs adnotacji i 2. aspekt wiosenny. Oto jeden ze sposobów ich realizacji:
Interfejs adnotacji:
Aspekt wiosenny:
źródło
Użyj
while
pętli zstatus
flagą lokalną . Zainicjuj flagę jakofalse
i ustaw ją na,true
gdy operacja się powiedzie, np. Poniżej:Spowoduje to ponawianie próby aż do pomyślnego zakończenia.
Jeśli chcesz spróbować ponownie tylko określoną liczbę razy, użyj również licznika:
Spróbuje to maksymalnie 10 razy, jeśli nie powiedzie się, do tego czasu wyjdzie, jeśli zakończy się sukcesem przed rozdaniem.
źródło
!success
w swoim czasie, możesz po prostu wyrwać się, gdy sukces jest prawdziwy.success
nigdzie w swoimcatch
. Więc wydaje się zbędne sprawdzanie tego przy każdym uruchomieniucatch
.success
. Wypróbuj to.To stare pytanie, ale rozwiązanie jest nadal aktualne. Oto moje ogólne rozwiązanie w Javie 8 bez użycia biblioteki innej firmy:
Przygotujmy przypadek testowy, taki jak:
źródło
Prostym sposobem rozwiązania tego problemu byłoby zawinięcie pętli try / catch w pętlę while i utrzymanie zliczania. W ten sposób można zapobiec nieskończonej pętli, sprawdzając liczbę innych zmiennych, zachowując dziennik błędów. To nie jest najbardziej wykwintne rozwiązanie, ale zadziałałoby.
źródło
Użyj do-while, aby zaprojektować blok ponownej próby.
źródło
Jeśli jest to użyteczne, należy rozważyć kilka innych opcji, wszystkie razem zebrane (plik stop zamiast prób, sen i kontynuuj większą pętlę) - wszystko to może być pomocne.
źródło
Możesz użyć https://github.com/bnsd55/RetryCatch
Przykład:
Zamiast tego
new ExampleRunnable()
możesz przekazać własną anonimową funkcję.źródło
Jeśli nie wszystkie wyjątki wymagają ponownej próby, tylko niektóre. A jeśli trzeba wykonać przynajmniej jedną próbę, oto alternatywna metoda użyteczności:
Stosowanie:
źródło
Wszystko, co robi Try-Catch, pozwala na awarię twojego programu. W instrukcji catch na ogół próbujesz zapisać błąd, a jeśli to konieczne, możesz wycofać zmiany.
źródło
(!finished)
?while(finished)
. Wolę używać bardziej pełnej wersji.while(!finished)
wyglądawhile (finished)
?IsPopulated()
która właśnie powraca,!IsNullOrEmpty()
aby upewnić się, że moje zamiary są zrozumiałe dla wszystkich programistów.Wiem, że jest już wiele podobnych odpowiedzi i moja niewiele się różni, ale i tak opublikuję, ponieważ dotyczy konkretnej sprawy / problemu.
Gdy mamy do czynienia z
facebook Graph API
naPHP
was czasami pojawia się błąd, ale natychmiast ponownie próbuje to samo da wynik pozytywny (dla różnych Magical powodów internetowych, które są poza zakresem tej kwestii). W takim przypadku nie ma potrzeby naprawy żadnego błędu, ale po prostu spróbować ponownie, ponieważ wystąpił pewien rodzaj „błędu na Facebooku”.Ten kod jest używany natychmiast po utworzeniu sesji na Facebooku:
Ponadto
for
odliczanie pętli do zera ($attempt--
) ułatwia zmianę liczby prób w przyszłości.źródło
Oto moje rozwiązanie z bardzo prostym podejściem!
źródło
Nie jestem pewien, czy jest to „profesjonalny” sposób na zrobienie tego i nie jestem całkowicie pewien, czy to działa na wszystko.
źródło
https://github.com/tusharmndr/retry-function-wrapper/tree/master/src/main/java/io
źródło
Oto wielokrotnego użytku i bardziej ogólne podejście do Java 8+, które nie wymaga bibliotek zewnętrznych:
Stosowanie:
źródło
Problem z pozostałymi rozwiązaniami polega na tym, że funkcja korespondenta próbuje nieprzerwanie bez przerwy między nimi, co powoduje nadmierne zalanie stosu.
Dlaczego nie tylko przychodzić
try
co sekundę i po wieczność ?Oto rozwiązanie wykorzystujące
setTimeout
i funkcja rekurencyjna:Zastąp funkcję
Run()
funkcją lub kodem, który chcesz powtarzaćtry
co sekundę.źródło
Spróbuj użyć sprężyn @Retable Adnotation, poniższa metoda spróbuje ponownie wykonać 3 próby, gdy wystąpi wyjątek RuntimeException
źródło
Poniżej fragmentu kodu należy wykonać fragment kodu. Jeśli wystąpił błąd podczas wykonywania fragmentu kodu, uśpij przez M milisekund i spróbuj ponownie. Link referencyjny .
źródło
Oto moje rozwiązanie podobne do niektórych innych, które może zawijać funkcję, ale pozwala ci uzyskać wartość zwracaną przez funkcje, jeśli się ona wywoła.
źródło