Interagirei con un sacco di json profondamente annidato che non ho scritto e vorrei rendere il mio script python più "permissivo" all'input non valido. Mi trovo a scrivere blocchi provati, tranne i blocchi, e preferisco semplicemente avvolgere la discutibile funzione.Decoratore generale per avvolgere prova tranne in python?
Capisco che sia una cattiva politica ingoiare le eccezioni, ma preferirei che fossero stampate e analizzate in seguito, piuttosto che interrompere l'esecuzione. È più utile, nel mio caso d'uso, continuare ad eseguire il ciclo piuttosto che ottenere tutte le chiavi.
Ecco quello che sto facendo ora:
try:
item['a'] = myobject.get('key').METHOD_THAT_DOESNT_EXIST()
except:
item['a'] = ''
try:
item['b'] = OBJECT_THAT_DOESNT_EXIST.get('key2')
except:
item['b'] = ''
try:
item['c'] = func1(ARGUMENT_THAT_DOESNT_EXIST)
except:
item['c'] = ''
...
try:
item['z'] = FUNCTION_THAT_DOESNT_EXIST(myobject.method())
except:
item['z'] = ''
Ecco cosa mi piacerebbe, (1):
item['a'] = f(myobject.get('key').get('subkey'))
item['b'] = f(myobject.get('key2'))
item['c'] = f(func1(myobject)
...
o (2):
@f
def get_stuff():
item={}
item['a'] = myobject.get('key').get('subkey')
item['b'] = myobject.get('key2')
item['c'] = func1(myobject)
...
return(item)
. ..dove posso racchiudere il singolo elemento dati (1), o una funzione master (2), in una funzione che trasforma le eccezioni di esecuzione-arresto in campi vuoti, stampati su stdo ut. Il primo sarebbe una sorta di salto in base all'elemento - dove quella chiave non è disponibile, si registra in bianco e si sposta - quest'ultimo è un salto di riga, dove se uno qualsiasi dei campi non funziona, l'intero record è saltato.
La mia comprensione è che una specie di wrapper dovrebbe essere in grado di risolvere questo problema. Ecco cosa ho provato, con un wrapper:
def f(func):
def silenceit():
try:
func(*args,**kwargs)
except:
print('Error')
return(silenceit)
Ecco perché non funziona. Chiamare una funzione che non esiste, non try-catch via:
>>> f(meow())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'meow' is not defined
Prima ancora di aggiungere un valore di ritorno in bianco, mi piacerebbe farlo try-catch in modo corretto. Se la funzione avesse funzionato, questo avrebbe stampato "Errore", giusto?
Un wrapper funziona correttamente qui?
UPDATE
Ho avuto un sacco di veramente utile, risposte utili di seguito, e vi ringrazio per loro --- ma ho modificato gli esempi che ho usato in precedenza per illustrare che sto cercando per catturare più di errori di chiave annidati, che sto cercando specificamente per una funzione che avvolge un try-catch per ...
- Quando un metodo non esiste.
- Quando un oggetto non esiste e sta ricevendo un metodo chiamato su di esso.
- Quando un oggetto che non esiste viene chiamato come argomento per una funzione.
- Qualsiasi combinazione di una di queste cose.
- Bonus, quando una funzione non esiste.
Per accedere JSON nidificato nello specifico, si potrebbe vuoi guardare [safeJSON] (https://github.com/NYTimes/safejson). Questo funziona avvolgendo efficacemente l'oggetto 'mioobject'. – BrenBarn