2016-12-20 3 views
4

Ich habe keine Kontrolle über eine Python-Bibliothek, die unnötig eine bestimmte Ausnahme auslöst.Gibt es eine Möglichkeit, Ausnahme in Python "Un-raise"?

Gibt es eine Möglichkeit, mit einer Exception-Unterklasse "Placebo" umzugehen? das heißt

class MyException(Exception): 
    def __init__(self, value): 
     # literally do nothing. return to program flow 
     pass 
+3

Wollen Sie nur die Ausnahme fangen?Sie können nicht verhindern, dass eine Exception ausgelöst wird, indem Sie den Initialisierer ändern (der nur die Exception als Wert betrifft, anstatt den 'raise' rückgängig zu machen). –

+2

Da Sie eine bestimmte Ausnahme haben, können Sie die Ausnahme behandeln, indem Sie die Ausnahmeklasse in der except-Klausel eines 'try-except'-Blocks angeben. –

+0

könnte ich. Ich hatte gehofft, nicht alle Anrufe zu umhüllen und die Ausnahmeklasse oder etwas neu zu definieren. Ich möchte die Raise "rückgängig machen" – Jared

Antwort

5

eine bestimmte Ausnahme wirft

Sie haben eine bestimmte Ausnahme, sollten Sie die Ausnahme durch die Angabe der Ausnahmeklasse in der Ausnahme-Klausel einer try-except Block behandeln.

Der Placebo Ansatz (dh except Exception...) ist nur noch andere Ausnahmen zum Schweigen zu bringen, da Ausnahmen typischerweise von Exception ableiten oder überhaupt nicht zur Arbeit gehen (mit Ihrer neuen Ausnahmeklasse), da die ausgelöste Ausnahme ist offenbar nicht abgeleitet aus der neuen Ausnahmeklasse.


Beachten Sie:

Fehler sollten niemals still passieren, es sei denn ausdrücklich

zum Schweigen gebracht

So sehe ich nicht, warum Sie wollen würde rückgängig machen eine erhöhte Ausnahme ohne ein try-except. Die Ausnahme wurde nicht umsonst erhoben.


Wenn Sie hoffen, die Verwendung von try-except jedes Mal, wenn die Funktion aus dieser Bibliothek zu vermeiden genannt wird, dann könnte man eine Wrapper-Funktion schreiben, die den Anruf mit einem try-except Wraps, und dann die neue Funktion von nun an .

from somelib import func 
from somelib import SomeException 


def wrapper_func(*args, **kwargs): 
    try: 
     func(*args, **kwargs) 
    except SomeException: 
     pass 
+0

Außer dies hat ein anderes Verhalten als die Ausnahme "rückgängig machen". Mit der obigen Zeile wird die Zeile nach der Raise-Exception * nicht * ausgeführt. – Jared

+0

@Jared Sie scheinen den Grund, warum die Ausnahme überhaupt existierte, zu untergraben. Wie würdest du * einen 'ZeroDivisionError' rückgängig machen? –

0

Während die andere Antwort richtig ist, wenn Sie mit einem seltsamen/Buggy-Modul zu tun haben können Sie fuckitpy einen Versuch geben!

Beachten Sie, dass es im Allgemeinen eine sehr schlechte Idee ist, die Ausnahmen stillschweigend passieren zu lassen.

Wie auch immer, die grundlegende Art und Weise fuckitpy zu verwenden ist (Zitat aus der Dokumentation):

import fuckit 
#import some_shitty_module 
fuckit('some_shitty_module') 
some_shitty_module.some_function() 

Auch aus der Dokumentation:

noch Fehler zu bekommen? Kettenfickit ruft an. Dieses Modul ist wie Gewalt: Wenn es nicht funktioniert, braucht man nur mehr davon.

import fuckit 
fuckit(fuckit('some_shitty_module')) 
# This is definitely going to run now. 
some_shitty_module.some_function() 

fuckitpy (GitHub): https://github.com/ajalt/fuckitpy

Verwandte Themen