La gestió d'errors és una part essencial del desenvolupament d'aplicacions web. En aquest tema, aprendrem com gestionar errors de manera eficient en una aplicació Flask. Això inclou la captura d'excepcions, la creació de pàgines d'error personalitzades i l'ús de tècniques de registre per monitoritzar i depurar errors.

Conceptes Clau

  1. Captura d'Excepcions: Utilitzar blocs try-except per capturar i gestionar errors.
  2. Gestors d'Errors: Definir funcions específiques per gestionar diferents tipus d'errors HTTP.
  3. Pàgines d'Error Personalitzades: Crear plantilles personalitzades per mostrar missatges d'error als usuaris.
  4. Registre d'Errors: Utilitzar el registre per mantenir un registre dels errors que es produeixen en l'aplicació.

Captura d'Excepcions

En Python, podem utilitzar blocs try-except per capturar excepcions i gestionar-les de manera adequada. Aquí teniu un exemple bàsic:

try:
    # Codi que pot generar una excepció
    result = 10 / 0
except ZeroDivisionError:
    # Gestió de l'excepció
    print("No es pot dividir per zero!")

Gestors d'Errors en Flask

Flask permet definir gestors d'errors per a diferents codis d'estat HTTP. Aquests gestors es defineixen utilitzant el decorador @app.errorhandler. Aquí teniu un exemple de com gestionar un error 404 (No Trobat):

from flask import Flask, render_template

app = Flask(__name__)

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

En aquest exemple, quan es produeix un error 404, Flask renderitza la plantilla 404.html.

Pàgines d'Error Personalitzades

Podem crear plantilles personalitzades per mostrar missatges d'error als usuaris. Aquí teniu un exemple d'una plantilla 404.html:

<!DOCTYPE html>
<html lang="ca">
<head>
    <meta charset="UTF-8">
    <title>Pàgina No Trobada</title>
</head>
<body>
    <h1>Error 404</h1>
    <p>La pàgina que cerques no existeix.</p>
    <a href="{{ url_for('index') }}">Torna a la pàgina principal</a>
</body>
</html>

Registre d'Errors

El registre d'errors és crucial per monitoritzar i depurar problemes en una aplicació. Flask utilitza la biblioteca logging de Python per registrar errors. Aquí teniu un exemple de com configurar el registre d'errors:

import logging
from logging.handlers import RotatingFileHandler

if not app.debug:
    # Configurar el registre d'errors
    file_handler = RotatingFileHandler('errors.log', maxBytes=10240, backupCount=10)
    file_handler.setLevel(logging.ERROR)
    formatter = logging.Formatter(
        '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]')
    file_handler.setFormatter(formatter)
    app.logger.addHandler(file_handler)

En aquest exemple, els errors es registren en un fitxer errors.log amb un format específic.

Exercici Pràctic

Objectiu

Crear una aplicació Flask que gestioni errors 404 i 500 amb pàgines d'error personalitzades i registre d'errors.

Passos

  1. Crear l'Aplicació Flask:

    from flask import Flask, render_template
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        return "Benvingut a la pàgina principal!"
    
    @app.route('/error')
    def error():
        raise Exception("Això és un error intencionat!")
    
    if __name__ == '__main__':
        app.run(debug=True)
    
  2. Definir Gestors d'Errors:

    @app.errorhandler(404)
    def page_not_found(e):
        return render_template('404.html'), 404
    
    @app.errorhandler(500)
    def internal_server_error(e):
        return render_template('500.html'), 500
    
  3. Crear Plantilles d'Error:

    • 404.html:
      <!DOCTYPE html>
      <html lang="ca">
      <head>
          <meta charset="UTF-8">
          <title>Pàgina No Trobada</title>
      </head>
      <body>
          <h1>Error 404</h1>
          <p>La pàgina que cerques no existeix.</p>
          <a href="{{ url_for('index') }}">Torna a la pàgina principal</a>
      </body>
      </html>
      
    • 500.html:
      <!DOCTYPE html>
      <html lang="ca">
      <head>
          <meta charset="UTF-8">
          <title>Error Intern del Servidor</title>
      </head>
      <body>
          <h1>Error 500</h1>
          <p>Hi ha hagut un error intern del servidor.</p>
          <a href="{{ url_for('index') }}">Torna a la pàgina principal</a>
      </body>
      </html>
      
  4. Configurar el Registre d'Errors:

    import logging
    from logging.handlers import RotatingFileHandler
    
    if not app.debug:
        file_handler = RotatingFileHandler('errors.log', maxBytes=10240, backupCount=10)
        file_handler.setLevel(logging.ERROR)
        formatter = logging.Formatter(
            '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]')
        file_handler.setFormatter(formatter)
        app.logger.addHandler(file_handler)
    

Solució

from flask import Flask, render_template
import logging
from logging.handlers import RotatingFileHandler

app = Flask(__name__)

@app.route('/')
def index():
    return "Benvingut a la pàgina principal!"

@app.route('/error')
def error():
    raise Exception("Això és un error intencionat!")

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

@app.errorhandler(500)
def internal_server_error(e):
    return render_template('500.html'), 500

if not app.debug:
    file_handler = RotatingFileHandler('errors.log', maxBytes=10240, backupCount=10)
    file_handler.setLevel(logging.ERROR)
    formatter = logging.Formatter(
        '%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]')
    file_handler.setFormatter(formatter)
    app.logger.addHandler(file_handler)

if __name__ == '__main__':
    app.run(debug=True)

Conclusió

En aquesta secció, hem après com gestionar errors en una aplicació Flask. Hem vist com capturar excepcions, definir gestors d'errors, crear pàgines d'error personalitzades i configurar el registre d'errors. La gestió adequada dels errors és crucial per proporcionar una bona experiència d'usuari i per facilitar la depuració i el manteniment de l'aplicació. En el següent tema, explorarem com crear pàgines d'error personalitzades per millorar encara més l'experiència de l'usuari.

Curs de Desenvolupament Web amb Flask

Mòdul 1: Introducció a Flask

Mòdul 2: Conceptes Bàsics de Flask

Mòdul 3: Formularis i Entrada d'Usuari

Mòdul 4: Integració de Bases de Dades

Mòdul 5: Autenticació d'Usuaris

Mòdul 6: Conceptes Avançats de Flask

Mòdul 7: APIs RESTful amb Flask

Mòdul 8: Desplegament i Producció

Mòdul 9: Proves i Millors Pràctiques

Mòdul 10: Extensions i Ecosistema de Flask

© Copyright 2024. Tots els drets reservats