Try-catch está destinado a ayudar en el manejo de excepciones. Esto significa de alguna manera que ayudará a nuestro sistema a ser más robusto: intente recuperarse de un evento inesperado.
Sospechamos que algo podría suceder al ejecutar e instruir (enviar un mensaje), por lo que queda encerrado en el intento. Si sucede algo casi inesperado, podemos hacer algo: escribimos la captura. No creo que hayamos llamado para registrar la excepción. Creo que el bloque catch está destinado a darnos la oportunidad de recuperarnos del error.
Ahora, digamos que nos recuperamos del error porque pudimos arreglar lo que estaba mal. Podría ser super agradable volver a intentarlo:
try{ some_instruction(); }
catch (NearlyUnexpectedException e){
fix_the_problem();
retry;
}
Esto caería rápidamente en el ciclo eterno, pero digamos que el fix_the_problem devuelve verdadero, luego volvemos a intentarlo. Dado que no existe tal cosa en Java, ¿cómo resolvería USTED este problema? ¿Cuál sería su mejor código de diseño para resolver esto?
Esto es como una pregunta filosófica, dado que ya sé que lo que estoy pidiendo no es compatible directamente con Java.
fuente
remove()
desde unajava.util.Queue
, lo que ocurre yInvalidElementException
cuando la cola está vacía. En lugar de preguntar si está vacío, rodeo las acciones en un try-catch (que bajo concurrencia se vuelve obligatorio incluso con el if anterior). En tal caso, en elcatch
bloque pediría rellenar la cola con más elementos y luego volver a intentarlo. VoilaRespuestas:
Necesitas encerrar tu
try-catch
interior en unwhile
bucle como este: -He tomado
count
ymaxTries
para evitar tropezar con un bucle infinito, en caso de que la excepción siga ocurriendo en sutry block
.fuente
maxTries
. De lo contrario, se encontrará con uninfinite loop
usuario si continuamente ingresa información incorrecta y, por lo tanto, no saldrá. De nada sin embargo. :)Solución obligatoria "emprendedora":
Y para llamar:
fuente
Como de costumbre, el mejor diseño depende de las circunstancias particulares. Sin embargo, generalmente escribo algo como:
fuente
continue
sea necesario allí ... Y simplemente puedes cambiar la condición if.Aunque
try/catch
intowhile
es una estrategia bien conocida y buena, quiero sugerirte una llamada recursiva:fuente
limit
contado el método que se está recurriendo? A diferencia de la versión en bucle, que se lanzará al nivel 'original' ...void retry(int times) { (...) if (times==0) throw w; retry(times--);
Su escenario exacto manejado a través de Failsafe :
Bastante simple.
fuente
Puede usar anotaciones AOP y Java de jcabi-aspectos (soy desarrollador):
También podría usar
@Loggable
y@LogException
anotaciones.fuente
fix_the_problem();
en el bloque catchLa mayoría de estas respuestas son esencialmente las mismas. El mío también, pero esta es la forma que me gusta.
fuente
fix_the_problem
después del último intento. Esa podría ser una operación costosa y podría perder algo de tiempo.if (tryCount < max) fix()
, pero este es el formato de un enfoque general; los detalles dependerán de un caso específico. También hay un Retryer a base de guayaba que he estado mirando.Spring AOP y solución basada en anotaciones:
Uso (
@RetryOperation
es nuestra anotación personalizada para el trabajo):Necesitaremos dos cosas para lograr esto: 1. una interfaz de anotación, y 2. un aspecto de resorte. Aquí hay una forma de implementarlos:
La interfaz de anotación:
El aspecto primaveral:
fuente
Use un
while
bucle constatus
bandera local . Inicialice el indicador comofalse
y configúrelotrue
cuando la operación sea exitosa, por ejemplo a continuación:Esto volverá a intentarlo hasta que tenga éxito.
Si desea volver a intentarlo solo un cierto número de veces, use también un contador:
Esto intentará un máximo de 10 veces si no tiene éxito hasta entonces, y saldrá si tiene éxito de antemano.
fuente
!success
en su tiempo, puede salir de cuando el éxito es cierto.success
en ninguna parte de tucatch
. Por lo tanto, parece redundante comprobarlo, en cada ejecución decatch
.success
. Pruébalo.Esta es una vieja pregunta, pero una solución sigue siendo relevante. Aquí está mi solución genérica en Java 8 sin usar ninguna biblioteca de terceros:
Tengamos un caso de prueba como:
fuente
Una manera simple de resolver el problema sería envolver el try / catch en un ciclo while y mantener un conteo. De esta forma, podría evitar un bucle infinito al verificar un recuento con alguna otra variable mientras mantiene un registro de sus fallas. No es la solución más exquisita, pero funcionaría.
fuente
Use un do-while para diseñar el bloque de reintento.
fuente
En caso de que sea útil, un par de opciones más a considerar, todas juntas (detener el archivo en lugar de reintentos, dormir, continuar con un ciclo más grande), todo posiblemente útil.
fuente
Puede usar https://github.com/bnsd55/RetryCatch
Ejemplo:
En lugar de
new ExampleRunnable()
usted, puede pasar su propia función anónima.fuente
Si no todas las excepciones justifican un reintento, solo algunas. Y si hay que hacer al menos un intento, aquí hay un método de utilidad alternativo:
Uso:
fuente
Todo lo que un Try-Catch hace es permitir que su programa falle con gracia. En una declaración catch, generalmente intenta registrar el error y tal vez revierta los cambios si es necesario.
fuente
(!finished)
?while(finished)
. Prefiero usar la versión más detallada.while(!finished)
vewhile (finished)
?IsPopulated()
que simplemente regresa!IsNullOrEmpty()
para garantizar que todos los desarrolladores entiendan mi intención.Sé que ya hay muchas respuestas similares aquí, y la mía no es muy diferente, pero la publicaré de todos modos porque trata un caso / problema específico.
Cuando se trata con la información,
facebook Graph API
aPHP
veces se produce un error, pero volver a intentarlo inmediatamente dará un resultado positivo (por varias razones mágicas de Internet que están fuera del alcance de esta pregunta). En este caso no hay necesidad de arreglar ningún error, sino simplemente intentarlo de nuevo porque hubo algún tipo de "error de Facebook".Este código se usa inmediatamente después de crear una sesión de Facebook:
Además, al hacer que el
for
ciclo cuente hasta cero ($attempt--
), es bastante fácil cambiar el número de intentos en el futuro.fuente
¡La siguiente es mi solución con un enfoque muy simple!
fuente
No estoy seguro de si esta es la forma "profesional" de hacerlo y no estoy completamente seguro de si funciona para todo.
fuente
https://github.com/tusharmndr/retry-function-wrapper/tree/master/src/main/java/io
fuente
Aquí un enfoque reutilizable y más genérico para Java 8+ que no requiere bibliotecas externas:
Uso:
fuente
El problema con las soluciones restantes es que, la función correspondiente intenta continuamente sin un intervalo de tiempo intermedio, por lo tanto sobre inundando la pila.
¿Por qué no
try
solo cada segundo y después del eterno ?Aquí una solución usando
setTimeout
y una función recursiva:Reemplace la función
Run()
por la función o el código que le gustaría volvertry
cada segundo.fuente
Pruébelo utilizando los resortes @Anotaciones retribuibles, el siguiente método volverá a intentarlo por 3 intentos cuando se produzca RuntimeException
fuente
Debajo del fragmento ejecute un fragmento de código. Si tiene algún error al ejecutar el fragmento de código, duerma durante M milisegundos y vuelva a intentarlo. Referencia enlace .
fuente
Aquí está mi solución similar a algunas otras que pueden ajustar una función, pero le permite obtener el valor de retorno de las funciones, si tiene éxito.
fuente