/ / Python: Propagujte výnimku pomocou bloku Try / Exception s viacerými výnimkami - python, výnimka, spracovanie chýb, spracovanie výnimiek

Python: Rozmnožovanie výnimky prostredníctvom funkcie Try / Except Block s viacerými výnimkami - python, výnimka, spracovanie chýb, spracovanie výnimiek

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ď č. 1

Máte dve možnosti:

  • Nedotýkajte sa IndexError so špecializovaným except .. blok. Vždy môžete manuálne otestovať typ výnimky vo všeobecnom bloku tak, že chytíte BaseException a priradenie výnimky názvu (tu e):

    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