Existuje spôsob, ako propagovať výnimku v bloku vyskúšať / vylúčiť z jedného okrem nasledujúceho?
Chcem zachytiť konkrétnu chybu a potom vykonať aj všeobecné spracovanie chýb.
"raise" umožňuje, aby sa výnimka "bubble up" dostala na vonkajší pokus / s výnimkou, ale nie vnútri bloku try / okrem, ktorý zvýšil chybu.
V ideálnom prípade by to malo byť toto:
import logging
def getList():
try:
newList = ["just", "some", "place", "holders"]
# Maybe from something like: newList = untrustedGetList()
# Faulty List now throws IndexError
someitem = newList[100]
return newList
except IndexError:
# For debugging purposes the content of newList should get logged.
logging.error("IndexError occured with newList containing: n%s", str(newList))
except:
# General errors should be handled and include the IndexError as well!
logging.error("A general error occured, substituting newList with backup")
newList = ["We", "can", "work", "with", "this", "backup"]
return newList
Problém je v tom, že keď sa IndexError chytí s prvým výnimkou, moje všeobecné spracovanie chýb v druhom bloku sa neaplikuje.
Jediným riešením, ktoré mám teraz, je zahrnúť aj všeobecný kód na spracovanie chýb do prvého bloku. Aj keď to zabalím do vlastného funkčného bloku, stále sa zdá byť menej elegantný ...
odpovede:
3 pre odpoveď č. 1Máte dve možnosti:
Nedotýkajte sa
IndexError
so špecializovanýmexcept ..
blok. Vždy môžete manuálne otestovať typ výnimky vo všeobecnom bloku tak, že chytíteBaseException
a priradenie výnimky názvu (tue
):try: # ... except BaseException as e: if isinstance(e, IndexError): logging.error("IndexError occured with newList containing: n%s", str(newList)) logging.error("A general error occured, substituting newList with backup") newList = ["We", "can", "work", "with", "this", "backup"] return newList
Použite vnorené
try..except
vyhlásenia a opätovné zvýšenie:try: try: # ... except IndexError: logging.error("IndexError occured with newList containing: n%s", str(newList)) raise except: logging.error("A general error occured, substituting newList with backup") newList = ["We", "can", "work", "with", "this", "backup"] return newList