2010-10-14 5 views
3

Possible en double:
Does a exception with just a raise have any use?Toute valeur pour intercepter une exception et la relancer immédiatement?

Y at-il valeur de re-soulever une exception sans autre code entre les deux? J'ai récemment regardé du code et j'ai vu quelques blocs comme ceux-ci avec rien d'extra dans le bloc except mais une autre relance. Je suppose que c'était une erreur et une mauvaise prise de décision, ai-je raison?

+0

sth, vous avez raison que c'est un doublon. Dans son cas, le code avait cependant une exigence valide pour diviser les sous-classes. –

Répondre

2

J'ai déjà vu un code similaire dans un (ensemble de) projets VB.NET horribles. Soit l'intention était d'attraper et de consigner des exceptions, sans jamais revenir pour terminer la journalisation, soit ils ont entendu "vous devez attraper des exceptions", ont implémenté cette fonctionnalité, et quelqu'un d'autre a décidé que cela devrait juste sur-relancer.

Il n'y a aucun avantage pour le code ci-dessus.

2

Je ne suis pas capable de trouver quelque chose d'utile, sauf pour le garder comme un espace réservé pour l'insertion ultérieure pour attraper des exceptions utiles.

Cela évite en quelque sorte de re-indenter le code, quand vous voulez inclure les blocs "try .. sauf .." plus tard.

1

Oui, c'est généralement une mauvaise pratique. La seule utilisation (un peu) correcte que j'ai vu de ce modèle était avant que VB.NET ait une construction Using disponible. Utilisation avait l'air quelque chose comme:

Dim myResource As DisposableService 

Try 
    myResource = New DisposableService() 
    ' This might throw an exception.... 
    myResource.DoSomething() 
Catch 
    Throw 
Finally 
    ' Perform cleanup on resource 
    If Not myResource Is Nothing Then 
     myResource.Dispose() 
    End If 
End Try 

Autre que cela, je ne peux pas penser à un bon cas d'utilisation pour ce genre de chose.

+0

Hah. Curieusement, nous avons tous les deux des exemples vb.net! –

+1

Funnily; ou malheureusement? ;) – DanP

+0

Ne pourriez-vous pas omettre la séquence catch-throw? – Yuliy

0

Typiquement dans un modèle try-catch, toute exception non interceptée sera automatiquement levée (relancée?). Attraper l'exception uniquement pour la relancer peut être dans le code de style Allman, mais ne sert à rien.

0

Euh, Imaginer

def something(a,b): 
    try: 
     // do stuff 
    except SomethingSpecificToThisFunction: 
     //handle 
    except: //Everything else, should likely be handled somewhere else 
     raise 


try: 
    something("a","b") 
except e: 
    Log(e) 

ensuite à nouveau son comportement par défaut de toute façon, donc pourriez vouloir laisser sortir

2

Exemple construit sur this question. S'il y a d'autres except dans le bloc try, il peut être utilisé pour filtrer les exceptions, mais seul c'est inutile.

class FruitException(Exception): pass 

try: 
    raise FruitException 
except FruitException: 
    print "we got a bad fruit" 
    raise 
except Exception: 
    print "not fruit related, irrelevant." 
0

Il existe certaines approches avec de telles techniques dans l'environnement multithread. Par exemple pour lancer quelque chose au niveau de la pile supérieure.

1

parfois utile laissez-moi vous donner un exemple réel que je je l'ai fait mon travail:

ce WAS est dans un décorateur qui enveloppe func: donc en gros ce que je voulais est de re-relancer l'erreur que je attrapé quand j'ai appelé la fonction func de sorte que le décorateur ne change pas le comportement de la fonction func, car lorsque func déclencher une exception les exceptions sont envoyées à l'interface graphique de sorte qu'un message d'erreur peut apparaître à l'utilisateur,

et pour l'essayer, sauf que je l'utilise parce que je veux exécuter le code dans enfin, même si une exception est soulevée

try: 
    result = func(self, *args, **kws) 
    return result 
except Exception, ex: 
    # If an exception is raised save it also. 
    logging_data['message'] = str(ex) 
    logging_data['type'] = 'exception' 

    # Raise the error catched here so that we could have 
    # the same behavior as the decorated method. 
    raise 
finally: 
    # Save logging data in the database 
    .... 

espérons que cela aidera à comprendre l'utilisation de re-raise