8
votes

En Java, quelle est la meilleure façon de continuer à appeler une fonction jusqu'à ce qu'aucune exception ne soit lancée?

Dans mon code Java, j'ai une fonction appelée gettangle () qui jette parfois un noangleexception . Est le code suivant la meilleure façon d'écrire une fonction qui continue à appeler gettangle () jusqu'à ce qu'aucune exception ne soit lancée? XXX

ou serait-il une meilleure idée de réécrire gettangle () pour revenir nan sur erreur?


0 commentaires

8 Réponses :


5
votes

Je pense que vous devriez étudier pourquoi gettangle () se lance une exception, puis résoudre le problème. Si cela est aléatoire, comme une entrée d'un capteur, vous devriez peut-être attendre un peu de temps jusqu'à ce que vous appelle à nouveau. Vous pouvez également faire du blocage de gettangle (), cela signifie que les gettangs () attendront qu'un bon résultat est acquis.

Ignorer la manière dont vous résolvez votre problème, vous devez avoir une sorte de mécanisme de délai d'attente, de sorte que vous ne vous retrouvez pas dans une activité sans fin. Cela suppose que vous ne voulez pas avoir une boucle éventuellement infinie, bien sûr.


3 commentaires

Je suis d'accord - gettangleBlocking () masque simplement tout problème sous-jacent, ce qui entraîne potentiellement ses propres problèmes en faisant potentiellement causer une boucle infinie ou un goulot d'étranglement de la performance.


Il devrait bien sûr y avoir des délais d'expression pour bloquer les appels. J'ai supprimé cette remarque afin de le garder simple.


Tout le point de GetangleBlocking est de fournir une version bloquante des gettangs. Si je décide de faire du blocage des gettangs, cela défait le point de l'exercice.



3
votes

Vous voulez appeler une méthode tant qu'elle jette une exception?

Ceci n'est pas la programmation. Vous devriez utiliser le débogueur et examiner le problème réel.

Et vous ne devriez jamais attraper une exception sans message ni journalisation!


1 commentaires

Je fais intentionnellement cela jeter l'exception. Je m'attends à l'exception. gettangle () essaie de transformer une direction comprise entre 1 et 9 sur un angle en degrés. Cependant, la direction est parfois 0, qui ne correspond pas à un angle.



2
votes

Je ne recommanderais pas de le faire de cette façon, car lorsque la gêne () ne retourne jamais une valeur valide (jette toujours une exception pour une raison quelconque), vous vous retrouvez dans une boucle sans fin. Vous devez au moins définir une condition de pause (E.G. Timeout) pour ce cas.


0 commentaires

0
votes

Ne jamais utiliser des exceptions pour gérer la logique de flux dans votre code.

Comme suggéré d'abord vérifier pourquoi vous obtenez parfois la précédente


0 commentaires

0
votes

sauf si vous utilisez une classe entièrement en dehors de votre contrôle, vous souhaitez vraiment reconsidérer la lancée d'une exception pour indiquer aucun angle.

Parfois, bien sûr, cela n'est pas possible non plus, car la classe n'est pas la vôtre ou, il n'est pas possible de faire une double utilisation du type retourné comme résultat ou état d'erreur.

pour Exemple, dans votre cas, en supposant que tous les diplômes entier (négatif et 0) sont des angles possibles, il n'est pas question de renvoyer une valeur INT qui indique une erreur et est distincte d'une valeur d'angle valide.

mais Permet de supposer que vos angles valides sont entre -360 -> 360 (ou équivalent. dans les radians). Ensuite, vous devriez vraiment considérer quelque chose comme: xxx


1 commentaires

C'était ma façon originale de le faire. Cependant, des exceptions semblaient une meilleure façon de le faire, car elle empêcha des utilisations négligentes de gettangle () où le cas exceptionnel n'a pas été vérifié.



10
votes

Je suis surpris de lire certaines des réponses à ce fil, car ce scénario est précisément la raison des exceptions vérifiées existent. Vous pouvez faire quelque chose comme: xxx

supposant que quelque chose en dehors du processus a changé entre-temps. En règle générale, quelque chose comme cela serait fait pour la reconnexion: xxx


0 commentaires

1
votes

En fin de compte, j'ai opté pour renvoyer une valeur NAN, car cela empêche une utilisation imprenable de Integer.min_Value ailleurs.

public float getAngle(boolean blocking)
{
    while(true)
    {
        int dir = getDirection();
        if(dir == 0 && !blocking)
            return Float.NaN;
        else
            return (dir - 5) * 30;
    }
}


0 commentaires

3
votes

Pourriez-vous ne pas avoir utilisé de récursivité? c'est-à-dire xxx


1 commentaires

Et oui, je me rends compte que cela est probablement horriblement mal dans les mauvaises circonstances. Je suppose que la notine exception est une exception aléatoire causée par un capteur ou quelque chose.