diff --git a/volk_load.py b/volk_load.py index ff0486c..e77090e 100644 --- a/volk_load.py +++ b/volk_load.py @@ -4,6 +4,7 @@ import time import traceback from datetime import datetime from urllib.request import urlopen +from urllib.error import URLError, HTTPError from dotenv import load_dotenv import mysql.connector from mysql.connector import Error @@ -155,26 +156,52 @@ def load_categories(): log_message(f"Запрос описания для категории {category_id} из {desc_url}") log_message("отладочное сообщение для проверки вывода в лог-файл") - with urlopen(desc_url) as response: - # Явно указываем кодировку UTF-8 при декодировании - raw_data = response.read() - log_message("raw data read") - try: - decoded_data = raw_data.decode('utf-8') - log_message("data decoded") - except UnicodeDecodeError as e: - error_msg = f"Ошибка декодирования ответа для категории {category_id}: {e}. Попытка декодирования как latin-1." - log_message(error_msg, "WARNING") - decoded_data = raw_data.decode('latin-1') - - try: - desc_response = json.loads(decoded_data) - log_message("json loaded") - except json.JSONDecodeError as e: - error_msg = f"Ошибка парсинга JSON для категории {category_id}: {e}. Первые 500 символов ответа: {decoded_data[:500]}" - log_message(error_msg, "ERROR") - # Пропускаем эту категорию и продолжаем обработку - continue + desc_response = None + try: + response = urlopen(desc_url) + log_message("urlopen успешно выполнен") + except (URLError, HTTPError, OSError) as e: + error_msg = f"Ошибка сетевого подключения при запросе описания категории {category_id} из {desc_url}: {type(e).__name__}: {e}" + log_message(error_msg, "ERROR") + traceback_str = traceback.format_exc() + log_message(f"Трассировка сетевой ошибки для категории {category_id}:\n{traceback_str}", "ERROR") + # Пропускаем эту категорию и продолжаем обработку + continue + + try: + with response: + # Явно указываем кодировку UTF-8 при декодировании + raw_data = response.read() + log_message("raw data read") + try: + decoded_data = raw_data.decode('utf-8') + log_message("data decoded") + except UnicodeDecodeError as e: + error_msg = f"Ошибка декодирования ответа для категории {category_id}: {e}. Попытка декодирования как latin-1." + log_message(error_msg, "WARNING") + decoded_data = raw_data.decode('latin-1') + + try: + desc_response = json.loads(decoded_data) + log_message("json loaded") + except json.JSONDecodeError as e: + error_msg = f"Ошибка парсинга JSON для категории {category_id}: {e}. Первые 500 символов ответа: {decoded_data[:500]}" + log_message(error_msg, "ERROR") + # Пропускаем эту категорию и продолжаем обработку + continue + except Exception as e: + error_msg = f"Ошибка при чтении ответа для категории {category_id}: {type(e).__name__}: {e}" + log_message(error_msg, "ERROR") + traceback_str = traceback.format_exc() + log_message(f"Трассировка ошибки чтения для категории {category_id}:\n{traceback_str}", "ERROR") + # Пропускаем эту категорию и продолжаем обработку + continue + + # Проверяем, что desc_response был успешно получен + if desc_response is None: + error_msg = f"Не удалось получить ответ для категории {category_id}" + log_message(error_msg, "ERROR") + continue # Проверка версии API api_version = desc_response.get('api_version')