Ho un modulo di accesso al database che chiamo con una query o un comando. Capisce cosa fare con il database e cerca di farlo. Ad esempio, se la query o la stringa di comando è patologica, la chiamata al modulo PGDB sottostante può generare un'eccezione.Eccezioni di cattura che non ereditano dall'eccezione
Alcune informazioni incredibilmente utili vengono restituite da PGDB (da PostgreSQL sotto quello), specificando in particolare quali errori sono stati rilevati nella query o nel comando. Questo tipo di utilizzo delle varie funzioni di PGDB recupera le informazioni:
try:
pgdb.dothing(mod.withx)
except Exception, e:
mod.error = 'pgdb.dothing('+str(type(mod.withx))+str(mod.withx)+') failed with: '+str(e)
Poi, quando i rendimenti di classe, dopo aver fallito, l'oggetto contiene il messaggio in .error e viola, posso riparare la mia stupidità nella query o un comando.
E questo tutto sembra funzionare bene - (in Python 2.2.2, che potrebbe cambiare per 2.Higher un giorno ... ma non ora - e mai e poi mai a 3.whatever)
Ma ... ho trovato questo bit di opacità: "l'eccezione non deve essere ereditata da Exception, quindi plain 'except:' cattura tutte le eccezioni, non solo il sistema.Le eccezioni String sono un esempio di un'eccezione che non fa t ereditare da Exception "
Quindi, ecco la domanda: perché mi interessa? Se viene lanciata un'eccezione, voglio sapere perché. Non mi interessa da dove provenga, in realtà, voglio solo il messaggio di errore, e sicuramente non voglio che Python si fermi. Ciò includerebbe se l'errore provenisse dalla stringa o da qualsiasi altra cosa. Quindi, ad eccezione di prendere tutto è buono. O dovrebbe essere.
È che il parametro di Eccezione significa che non intendo un errore se proviene, ad esempio, dalle viscere della stringa? E quindi, il codice si fermerà con un'eccezione non rilevata? E quindi avrei bisogno di una serie di catture per ogni tipo che "non eredita dall'eccezione" per ottenere il comportamento che voglio? Qualcosa del genere:
try:
pgdb.dothing(mod.withx)
except Exception, e:
mod.error = 'pgdb.dothing('+str(type(mod.withx))+str(mod.withx)+') failed with: '+str(e)
except:
mod.error = 'pgdb.dothing('+str(type(mod.withx))+str(mod.withx)+') failed with: WTF???'
... perché quello ... davvero fa schifo.
E, se questo è il caso, c'è un altro modo in cui posso catturare tutte le eccezioni di tutti i tipi e prendere il messaggio di errore per loro? Sembra che questo sia qualcosa che è altamente, altamente desiderabile (e sembra anche che un one-liner dovrebbe risolverlo, e dovrebbe sembrare un po 'come l'esempio precedente, piuttosto che il secondo.)
Per favore, prima tu rispondi: sì, so che Python 2.2.2 è vecchio. No, non verrà aggiornato presto. Questo è un sistema di produzione con diverse milioni di righe di codice; è stabile e vogliamo che rimanga così, basato su "non rotto, non fissato".
Ho solo bisogno di una solida comprensione di questa parte del processo di eccezione picchiato dentro di me. Tutte le spiegazioni sembrano fare supposizioni su ciò che so che sono ... ottimistiche. :)
Grazie per qualsiasi intuizione.
"Suggerisco anche di dare un'occhiata a ..." Ho fatto.E' dove ho ottenuto la citazione circa, tranne non sempre essendo da Eccezione da. Sembra che la tua risposta, sopra, faccia quello che ti sto chiedendo. Grazie mille. Inoltre, non sto ignorando gli errori. Sto provando a scoprire quale sia stato l'errore, e da quando ho Non ci sono quando succede, in generale, ho bisogno di catturare questo e farlo capire a me stesso - e all'utente, almeno in qualche modo: – fyngyrz
@fyngyrz, Non è un problema. alla documentazione con le mie risposte Se la mia risposta ti ha aiutato, w non consideri di colpire il segno di spunta sulla sinistra? :-) – MeetTitan