Bienvenido a la Comunidad de Treehouse

¿Quieres colaborar en errores de código? ¿Tienes errores que necesitan comentarios? ¿Buscas un par de ojos adicionales en tu último proyecto? aquí.

¿Buscas aprender algo nuevo?

Treehouse ofrece una prueba gratuita de siete días para estudiantes nuevos. Obtén acceso a miles de horas de contenido y únete a miles de

Inicia tu prueba gratuita

Python Conceptos Básicos de SQLAlchemy Trabajar con SQLAlchemy Buscar un Libro

David Hultén
David Hultén
8.327 Puntos

El mensaje ValueError no aparece de la función clean_id() incluso después de ser llamada

Tengo un problema donde no recibo el mensaje ValueError de clean_id() cuando escribo una cadena que no es int y en su lugar el programa sigue ejecutándose.

from models import (Base, session, 
                    Book, engine)
import datetime
import csv
import time


def menu():
    while True:
        print('''
               \nLIBROS DE PROGRAMACIÓN
               \r1) Agregar libro
               \r2) Ver todos los libros
               \r3) Buscar libro
               \r4) Análisis de libros
               \r5) Salir''')
        choice = input('¿Qué te gustaría hacer?')
        if choice in ['1', '2', '3', '4', '5']:
            return choice
        else:
            input('''
                    \rPor favor, elige una de las opciones anteriores.
                    \rUn número del 1-5
                    \rPresiona enter para intentar de nuevo''')
# agregar libros a la base de datos
# editar libros
# eliminar libros
# buscar libros
# limpieza de datos
def clean_date(date_str):
    months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 
              'August', 'September', 'October', 'November', 'December']
    split_date = date_str.split(' ')
    try:
        month = int(months.index(split_date[0]) + 1)
        day = int(split_date[1].split(',')[0])
        year = int(split_date[2])
        return_date = datetime.date(year, month, day)
    except ValueError:
        input('''
            \n****** ERROR DE FECHA ******
            \rEl formato de fecha debe incluir un Mes, Día y Año válidos del pasado.
            \rEj: January 13, 2003
            \rPresiona enter para intentar de nuevo
            \r************************''')
        return
    else:
        return return_date


def clean_price(price_str):
    try:
        price_float = float(price_str)
    except ValueError:
        input('''
            \n****** ERROR DE PRECIO ******
            \rEl precio debe ser un número sin símbolo de moneda.
            \rEj: 10.99
            \rPresiona enter para intentar de nuevo
            \r*************************''')
    else: 
        return int(price_float * 100)


def clean_id(id_str):
    try:
        book_id = int(id_str)
    except ValueError:
        input('''
            \n****** ERROR DE ID ******
            \rEl id debe ser un número.
            \rPresiona enter para intentar de nuevo
            \r**********************''')
        return
    else:
        return book_id


def add_csv():
    with open('suggested_books.csv') as csvfile:
        data = csv.reader(csvfile)
        for row in data:
            book_in_db = session.query(Book).filter(Book.title==row[0]).one_or_none()
            if book_in_db == None:
                title = row[0]
                author = row[1]
                date = clean_date(row[2])
                price = clean_price(row[3])
                new_book = Book(title=title, author=author, published_date=date, price=price)
                session.add(new_book)
        session.commit()


def app():
    app_running = True
    while app_running:
        choice = menu()
        if choice == '1':
            # agregar libro
            title = input('Título: ')
            author = input('Autor: ')
            date_error = True
            while date_error:
                date = input('Fecha de Publicación (Ej: October 25, 2017): ')
                date = clean_date(date)
                if type(date) == datetime.date:
                    date_error = False
            price_error = True
            while price_error:
                price = input('Precio (Ej: 25.64): ')
                price = clean_price(price)
                if type(price) == int:
                    price_error = False
            new_book = Book(title=title, author=author, published_date=date, price=price)
            session.add(new_book)
            session.commit()
            print('¡Libro agregado!')
            time.sleep(1.5)
        elif choice == '2':
            # ver libros
            for book in session.query(Book):
                print(f'{book.id} | {book.title} | {book.author}')
            input('\nPresiona enter para volver al menú principal')
        elif choice == '3':
            # buscar libro
            id_options = []
            for book in session.query(Book):
                id_options.append(book.id)
            id_error = True
            while id_error:
                id_choice = input(f'''
                    \nOpción de Id: {id_options}
                    \rId del libro: ''')
                id_choice = clean_id(id_choice)
                if type(id_choice) == int:
                    id_error = False
        elif choice == '4':
            # análisis
            pass
        else:
            print('ADIÓS')
            app_running = False


if __name__ == '__main__':
    Base.metadata.create_all(engine)
    add_csv()
    app()


    for book in session.query(Book):
        print(book)

1 Respuesta

Brian Jensen
sello-máscara
PERSONAL
.a{fill-rule:evenodd;}techdegree
Brian Jensen
Profesor de Treehouse

Hola David Hultén :wave:

El código que tienes hasta ahora en tu clean_id() función parece estar funcionando para mí. Si ejecuto tu código y elijo 3) Buscar libro luego ingreso algo que no es un int, como "test", correctamente lanza el ValueError. Avísame si es una parte diferente de la aplicación o escenario que estás probando donde simplemente continúa.

Una cosa a destacar: al elegir 3) Buscar libro e ingresar un valid int, pero ese es mantiene un libro válido id, tal como 25, la aplicación continuará y no lanzará un error. Alrededor de la 5:30 marca del video, Megan repasa la configuración de una excepción para ese escenario.`