Soy nuevo en el desarrollo web en Flask. ¿Debo comenzar a insertar declaraciones try / catch en mi aplicación para que sea a prueba de fallas?

Hay varias formas de asegurarse de que su aplicación sea segura.

La forma obvia es envolver los casos try catch bloques try catch .

El primer problema con este enfoque es que no puede saber de antemano qué y dónde pueden ocurrir los errores.

El segundo problema es determinar la precisión de la captura de errores. Ejemplo extremo:

[nota al margen. Los bloques de código no funcionan como se esperaba en Quora]

El tercer problema es que esta forma de hacer las cosas se volverá bastante engorrosa. Está contaminando su programa con alteraciones innecesarias del flujo de control. El razonamiento de su programa puede volverse bastante difícil con el tiempo.

====================

La siguiente forma interesante de garantizar la seguridad es utilizar algo como MayBe mónada. No entraré en detalles. pero, para una referencia rápida, considere este ejemplo: GetUserInfo("mik").getAccountData("payment").withdraw(100).errors()

Aquí, cada método encadenado tiene un manejo interno de los resultados None de los pasos anteriores.

Por ejemplo, si no existe dicho usuario, getAccountData , en lugar de intentar obtener datos (y lanzar un puntero nulo) pasará ese ninguno al siguiente método de cadena.

====================

La tercera forma es usar bibliotecas de validación de datos. Esto es particularmente útil si se trata de diferentes tipos de datos de entrada. Por ejemplo: esquema JSON e hiper-esquema

Debe hacer que su aplicación sea segura. Eso es evidente por sí mismo. Cómo hacer que su aplicación sea segura es un poco más complicada, por supuesto.

Python fomenta el patrón try / except cuando tiene sentido. Por ejemplo, si cree que un elemento está casi seguro en una lista, entonces tiene sentido escribir:

tratar:
lst [i] = 1
excepto IndexError:
pase #handle aquí

más bien que

si i <(len (lst) - 1):
lst [i] = 1

Pero si no sabe nada, entonces tiene sentido escribir if en lugar del bloque try-except.

O si necesita convertir una cadena en un int, simplemente puede hacer

tratar:
int (cadena)
excepto (OverflowError, ValueError, TypeError):
pase #handle aquí

en lugar de verificar con ifs si las cadenas contienen solo dígitos y no son demasiado largas.

Estos son puntos bastante sutiles, y si bien son importantes, la parte más importante es que debe hacer frente a todo tipo de errores potenciales, sin importar cómo. Escriba pruebas de unidad y funcionales muy rigurosas que cubran todo tipo de comentarios de usuarios que puedan ocurrir para asegurarse de que su aplicación pueda manejarlo.

Sí, debe tener un manejo adecuado de excepciones en su programa. Pero esto no es específico de Python o Flask, es solo sentido común.

¿Pero espero que te des cuenta de que envolver todo en un bloque de try no hará que la solicitud se complete mágicamente? Solo debe detectar excepciones de las que sabe cómo recuperarse y dejar el resto sin controlar, para que Flask pueda registrar el error y mostrar una página 500 Internal Server Error al usuario (Serie de frascos: gestión de errores). Si sus intentos de recuperación fallan, simplemente vuelva a lanzar y deje el resto en Flask.

después de manejar las excepciones que son lógicas, no tiene que detectar las excepciones inesperadas para que sean a prueba de fallas, puede dejarlo en el frasco, detectará esa excepción y emitirá un error de servidor 500, que no matará su servidor por cierto. Otro tipo de solicitudes continúan funcionando.

Generalmente trato de abstenerme del patrón try / except. Si es posible, recomendaría validar los datos entrantes a través de la lógica if / else. Esta decisión hace que su programa sea más preciso y fácil de mantener.