Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Chaîner les try /except

+2 votes

Ca concerne les bonnes pratiques. Est-ce que c'est "bien" de chaîner des try/except comme on le ferait avec des if/elif/else ?
Je suis toujours en train de me battre avec des arrays à n dimensions (mettons 3 et 5), ce qui m'a conduit à un code fonctionnel mais que je trouve un peu crade:

try:
    _ = mon_array.shape[4] # là je teste pour voir si c'est un array à 5 dimensions
    do_the_5_dimensions_thing()
    except:
        try:
            do_the_3_dimensions_thing()
        except:
            raise ValueError('bad dimension buddy')
demandé 19-Mai-2015 par furankun (1,434 points)

1 Réponse

+5 votes
 
Meilleure réponse

Selon la norme EAFP, ce n'est pas une bonne pratique d'imbriquer les try, except.
La solution c'est de passer par des fonctions ^^
Genre (pour une classe a donnée) :

def method_1_2_or_3():
    try:
        a.method1()
        return # si on arrive au return, on sort de la fonction 
    except AttributeError:
        pass
    try:
        a.method2()
        return
    except AttributeError:
        pass
    try:
        a.method3()
    except AttributeError:
        raise

Donc au lieu de faire le a.methodX, tu colles ton test monarray.shape[X] suivi de tes fonctions du genre dotheXdimensions_thing(), et tu colles l'exception que tu veux ^^.
De cette façon tu ponds autant de try que tu veux sans en imbriquer aucun ^^, et si un des test pass, la fonction s'effectue et on chope le return, et donc fin de la fonction. Sinon on passe au try suivant et ainsi de suite.

Pour des solutions un peu plus "exotiques", tu peux voir ici, , ou encore par là

répondu 19-Mai-2015 par boblinux (3,092 points)
edité 20-Mai-2015 par boblinux

En fait c'est marrant, c'est ce que j'avais fait au début. Et je me suis dit ensuite "pourquoi me faire chier avec des except: pass ? autant chaîner tout ça comme dans un bon vieux if".
Ce qu'il me manquait c'était le return, tout simplement.
(et tu as démontré une fois de plus que je poste sans faire de recherche sur les autres ressources à disposition se fouette le dos, par contre tu as mis deux fois le même lien vers StackOverflow :P )

avec IndexError même pas besoin de faire de recherche sur le net =D.

Edit : j'ai édité le lien *

...