Cómo usar try, excepto, si no, correctamente en Python

Así que quiero saber cuál es la forma correcta de escribir bashs, excepto las declaraciones. Soy nuevo en el manejo de errores en Python.

Opción 1

try: itemCode = items["itemCode"] dbObject=db.GqlQuery("SELECT * FROM %s WHERE code=:1" % dbName,itemCode).get() dbObject.delete() except AttributeError: print "There's no item with that code" except KeyError: print "Bad parameter name" except: print "Unknow error" 

opcion 2

 try: itemCode = items["itemCode"] except KeyError: print "Bad parameter name" else: dbObject=db.GqlQuery("SELECT * FROM %s WHERE code=:1" % dbName,itemCode).get() try: dbObject.delete() except AttributeError: print "There's no item with that code" except: print "Unknow error" 

Opción 3 Cualquier otra opción mejor que puedas imaginar.

Opción 1, vemos que envuelvo todo el código en un bloque try. Opción 2, utiliza bloques nesteds. Plantea una excepción en declaraciones de línea específicas.

Si hay un error en algún lugar, me alegraría saberlo.

Desde el zen de python, “plano es mejor que nested”. dbObject=db.GqlQuery("SELECT.... estilo Opción # 1 en general, aunque estoy un poco confundido en cuanto a si dbObject=db.GqlQuery("SELECT.... o dbObject.delete() genera un AttributeError . En cualquier caso, sin embargo, no debería tener que llamar al dbObject.delete() más de una vez.

Simple – depende Si está seguro de qué excepciones va a obtener, puede quedarse con 1) y, francamente, es el caso el 90% del tiempo. La segunda forma es útil si sabe que muchas rutinas de código pueden generar el mismo tipo de excepción.

En lugar de capturar KeyError, prefiero usar el método get de dicts con validación.

 itemCode = items.get("itemCode") # itemCode will be None, if no such key if itemCode is not None: print "code missing" 

Esta no es una solución “general” (ver comentarios a mi respuesta), pero en este caso será de ayuda.

Y en el primer caso no entiendo, por qué intentas eliminar dos veces.

 try: itemCode = items.get("itemCode") # itemCode will be None, if no such key if itemCode is not None: print "code missing" dbObject=db.GqlQuery("SELECT * FROM %s WHERE code=:1" % dbName,itemCode).get() dbObject.delete() except AttributeError: print "There's no item with that code" except StandardError as ex: # good idea to be prepared to handle various fails print "Unexpected error deleting item {}".format(ex) 

Y además, no olvides que Python finalmente tiene sección. A menudo es útil a veces.