web-dev-qa-db-fra.com

Retour dans le bloc de capture?

Est-il erroné d'avoir une déclaration return dans un bloc catch? Quelles sont les alternatives?
c'est à dire:

public bool SomeFunction()
{
    try
    {
        //somecode
        return true;
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.message);
        return false;
    }

}
53
lowlyintern

Vous pouvez retourner normalement depuis catch block . C'est normalement un bon code fonctionnel.

35
Svisstack

Une alternative serait de stocker la valeur de retour dans une variable temporaire:

public bool SomeFunction()
{
    bool success = true;
    try
    {
        //somecode
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.message);
        success = false;
    }

    return success;
}

Mais personnellement, je trouve que la façon dont vous l'avez écrit (avec une déclaration fourre-tout) est plus lisible. D'autre part, si vous attendez une exception spécifique et que vous pouvez avoir plusieurs chemins pour retourner avec succès ou non ...

try
{
    DoTheImportantThing();
    DoTheOtherThingThatMightFailButWeDontCare();
}
catch (DontCareAboutItException ex)
{
    log.Info(ex);
}
catch (Exception ex)
{
    log.Error(ex);
    return false;
}

return true;

Ensuite, à mon avis, vous feriez mieux de pousser les déclarations le plus près possible.

Remarque: en fonction de l'application, pensez à consigner les exceptions que vous avez détectées plutôt que de simplement les montrer à l'utilisateur. Les exceptions consignées sont beaucoup plus fiables que les récits des utilisateurs sur ce qui s'est passé.

19
Mark Rushakoff

Si dans le bloc try il y a déjà une déclaration return, je mettrais probablement l'autre retour à la fin de la fonction:

try
{
    //somecode
    return true;
}
catch(Exception ex)
{
    MessageBox.Show(ex.message);
}
return false;

Et ceci afin d’éviter les retours multiples si plusieurs exceptions doivent être gérées.

9
Darin Dimitrov

Ce n'est pas grave, sachez que certains codes peuvent être exécutés après l'instruction de retour (la valeur de retour sera encaissée).

    try
    {
        return;
    }
    catch(Exception ex)
    {
        return;
    }
    finally
    {
        //some code
    }
8
Andrew
public bool SomeFunction()
{
    try
    {
        //somecode
        return true;
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.message);
    }
    return false;
}

Personnellement, je mets la déclaration de retour au bas de la méthode au lieu de dans le bloc. Mais les deux vont bien. Tout est une question de lisibilité (subjective) et de directives dans votre organisation.

7
Bart

Oui, c'est parfaitement normal. 

N'oubliez pas que vous pouvez également utiliser finally block à exécuter après le retour.

2
Piotr Justyna

Ce n'est pas faux, mais si vous avez utilisé une ressource, généralement, finalement, block est utilisé pour la fermer, au lieu d'appeler deux fois la méthode close. Dans ce cas, vous pouvez choisir d'utiliser l'instruction return après le bloc finally.

2
Feyyaz

Cela me semble parfaitement logique pour une fonction qui retourne vrai en cas de succès et faux en cas d’échec. J'espère qu'il n'y a rien de mal à ça - je le fais tout le temps :)

0
Ray

Le but principal d'un bloc catch est de fournir un endroit où l'on peut procéder à une situation exceptionnelle qui s'est produite dans un bloc try. Donc, vous avez attrapé une exception, l'avez poursuivie ... et êtes revenu d'une méthode. Si la méthode de l'appelant ne se soucie pas de l'exception, cela est tout à fait normal. 

0
n535

Vous pouvez ajouter une return dans le bloc catch. Vous savez explicitement que votre code renverra et poursuivra l'exécution au lieu de s'arrêter au bloc catch. 

try{
    //do something
}
catch{
    //error handling
    return;
}

Au lieu d’avoir beaucoup de blocs try-catch dans votre code qui peuvent créer de la confusion et causer un désordre dans votre code, il est préférable de tout gérer dans votre capture d’essais et de vérifier l’erreur renvoyée. 

try{
    //do something
}
catch (Exception as err){
    if (err == "IOException"){
         //handle exception
    else if (err.indexOf("TypeError"){
         //handle exception
    }
}

Il existe deux façons de vérifier le type de l'exception afin de pouvoir afficher un message en conséquence. Vous pouvez également capturer des exceptions spécifiques si vous le souhaitez. Au lieu de Exception as err, vous pouvez faire catch IOException, ....

0
E. Oregel