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
David Hultén
8.327 PuntosEl 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
Profesor de TreehouseHola David Hultén
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.`