Найти - Пользователи
Полная версия: Игнорирование ошибки
Начало » Python для новичков » Игнорирование ошибки
1
lemon127
Сделал прогу которое показывает погоду, на модуле pyowm. Все работает. Но если пользователь сделает хоть одну опечатку в названии города, то программа вылетает. Как сделать так чтобы при ошибке программа не вылетала, и снова задал вопрос.
Код снизу

from pyowm import OWM
import math
from pyowm.utils.config import get_default_config
import string


config_dict = get_default_config()
config_dict = ‘ru’
owm = OWM(“KEY”, config_dict)
place = input(“Введите название города!: ”)
mgr = owm.weather_manager()
observation = mgr.weather_at_place(place)
w = observation.weather

#Температура
t = w.temperature(“celsius”)
t1 = t
t2= t
t3= t
t4= t

#Ветер
wi = w.wind()

#Влажность
humi = w.humidity

#облака
cl = w.clouds


#статус
st = w.status
dt= w.detailed_status

#время обновление
ti = w.reference_time('iso')

#Давление
pr = w.pressure

#Видимость
vd = w.visibility_distance

weather = (f“Сейчас в {place} температура {math.floor(t1)} C°\n{string.capwords(dt)}. Скорость ветра {math.floor(wi)} м/с”)

print(weather)

input()
Ocean
lemon127
можно использовать Built-in Exceptions https://docs.python.org/3/library/exceptions.html
А именно ValueError

Если задано неверное значение, то пишешь пользователю в эксепшене, что “Ваш город не найден. Вероятно, что вы неверно ввели его название. Проверьте и повторите ввод”
DamMercul
Вероятнее всего ошибку вызывает эта строчка:
 observation = mgr.weather_at_place(place)
Скопируй класс исключения, потом просто:
 try:
    observation = mgr.weather_at_place(place)
except "Исключение":
    print('Нет такого города')
На будущее, обрамляй код в теги
[code python][/code]
Ocean
lemon127
Все работает.
Странно, я попробовала запустить
 config_dict = ru
тут ошибка, правильный синтаксис вот так:
 config_dict['language'] = 'ru'

 weather = (f“Сейчас в {place} температура {math.floor(t1)} C°\n{string.capwords(dt)}. Скорость ветра {math.floor(wi)} м/с”)
Это тоже вылетит и ничего не напечатает, потому что температура и ветер не доделаны. Ошибка типов у тебя
Вот так работает и печатает
  
from pyowm import OWM
import math
from pyowm.utils.config import get_default_config
import string
config_dict = get_default_config()
config_dict['language'] = 'ru'
owm = OWM("insert-your-API-key", config_dict)
place = 'Paris'
# place = input(“Введите название города!: ”)
mgr = owm.weather_manager()
observation = mgr.weather_at_place(place)
w = observation.weather
#Температура
t = w.temperature('celsius')
t1 = int(t['temp'])
t2= t
t3= t
t4= t
#Ветер
wi = w.wind()['speed']
#Влажность
humi = w.humidity
#облака
cl = w.clouds
#статус
st = w.status
dt= w.detailed_status
#время обновление
ti = w.reference_time('iso')
#Давление
pr = w.pressure
#Видимость
vd = w.visibility_distance
weather = (f'Сейчас в {place} температура {math.floor(t1)} C°\n{string.capwords(dt)}. Скорость ветра {math.floor(wi)} м/с')
print(weather)
# input()

Но самое прикольное в другом. Ты никак не обрабатываешь кейс с городами тезками.
Москва, Санкт-Петербург, Лондон, Париж и так далее у нас на планете не в единственном экземпляре представлены и используемый тобой сервис про это знает.

  
from pyowm import OWM
from pyowm.utils.config import get_default_config
config_dict = get_default_config()
config_dict['language'] = 'ru'
owm = OWM("insert-your-API-key", config_dict)
place = ["Paris", "London", "Moscow", "Saint Petersburg", "New York", "Doesn't exist"]
reg = owm.city_id_registry()
for city in place:
    get_citi_id= reg.ids_for(city)
    print(get_citi_id)

  
[(2968815, 'Paris', 'FR'), (2988506, 'Paris', 'FR'), (2988507, 'Paris', 'FR'), (4125402, 'Paris', 'AR'), (4246659, 'Paris', 'IL'), (4303602, 'Paris', 'KY'), (4402452, 'Paris', 'MO'), (4647963, 'Paris', 'TN'), (4717560, 'Paris', 'TX'), (4974617, 'Paris', 'ME'), (5603240, 'Paris', 'ID'), (6455259, 'Paris', 'FR'), (6942553, 'Paris', 'CA')]
[(2643743, 'London', 'GB'), (4119617, 'London', 'AR'), (4298960, 'London', 'KY'), (4517009, 'London', 'OH'), (5056033, 'London', 'MO'), (5367815, 'London', 'CA'), (6058560, 'London', 'CA')]
[(5202009, 'Moscow', 'PA'), (524894, 'Moscow', 'RU'), (524901, 'Moscow', 'RU'), (5601538, 'Moscow', 'ID')]
[(498817, 'Saint Petersburg', 'RU'), (536203, 'Saint Petersburg', 'RU')]
[(5128638, 'New York', 'NY')]
[]

Так вот. Эта штука решает сразу 2 твои проблемы.
Если города не существует, то обрати внимание, что всегда отдается пустой список.

Введи проверку и обрабатывай ответ API.
Если len(get_citi_id) = 0, то пользователь явно ввел город по которому в сервисе нет данных или ввел с опечаткой.
Если len(get_citi_id) = 1, то в сервисе нашелся всего один город с искомым названием
Если len(get_citi_id) > 1, то на планете несколько городов с таким названием и тебе надо добавить дополнительную обработку.
Например,
- отображать список и предлагать пользователю выбор из нескольких городов;
- отображать погоду по всем найденным Лондонам/Парижам
- отдавать по тому, который первый под руку подвернулся
- запрашивать страну
и так далее.
Тут тебе уже решать, как в этом случае твой скрипт работать должен.







This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB