diff --git a/volk_load.py b/volk_load.py index 2c65a14..57dbe93 100644 --- a/volk_load.py +++ b/volk_load.py @@ -44,6 +44,23 @@ def log_message(message, category="VOLK_loader"): return False return False +def safe_log_direct(message, category="VOLK_loader"): + """Безопасная функция для прямой записи в лог-файл без обработки исключений + Используется в критических ситуациях, когда обычный log_message может не сработать""" + try: + timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + log_entry = f"[{timestamp}] [{category}] {message}\n" + # Прямая запись без контекстного менеджера для максимальной надежности + f = open(LOG_FILE, 'a', encoding='utf-8') + try: + f.write(log_entry) + f.flush() # Принудительно сбрасываем буфер + finally: + f.close() + except: + # Игнорируем все исключения - эта функция должна быть максимально безопасной + pass + def load_categories(): """Экспортируемая функция для загрузки категорий из JSON в базу данных""" inserted_count = 0 @@ -159,23 +176,45 @@ def load_categories(): desc_response = None try: - response = urlopen(desc_url) + # Добавляем таймаут для избежания зависаний (30 секунд) + from urllib.request import Request + req = Request(desc_url) + response = urlopen(req, timeout=30) log_message("urlopen успешно выполнен") except (URLError, HTTPError, OSError, socket.gaierror, socket.timeout, ConnectionError) as e: - log_message("ошибка urlopen") - 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") + # Используем безопасное логирование для критических ошибок + safe_log_direct("ПЕРЕХВАЧЕНА СЕТЕВАЯ ОШИБКА urlopen", "ERROR") + safe_log_direct(f"Категория: {category_id}, URL: {desc_url}", "ERROR") + safe_log_direct(f"Тип ошибки: {type(e).__name__}, Сообщение: {str(e)}", "ERROR") + try: + traceback_str = traceback.format_exc() + safe_log_direct(f"Трассировка:\n{traceback_str}", "ERROR") + except: + pass + # Также пробуем обычное логирование + try: + error_msg = f"Ошибка сетевого подключения при запросе описания категории {category_id} из {desc_url}: {type(e).__name__}: {e}" + log_message(error_msg, "ERROR") + except: + pass # Пропускаем эту категорию и продолжаем обработку continue except Exception as e: # Перехватываем любые другие исключения, которые могут возникнуть при urlopen - log_message("ошибка urlopen, шаг 2") - 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") + safe_log_direct("ПЕРЕХВАЧЕНА НЕОЖИДАННАЯ ОШИБКА urlopen", "ERROR") + safe_log_direct(f"Категория: {category_id}, URL: {desc_url}", "ERROR") + safe_log_direct(f"Тип ошибки: {type(e).__name__}, Сообщение: {str(e)}", "ERROR") + try: + traceback_str = traceback.format_exc() + safe_log_direct(f"Трассировка:\n{traceback_str}", "ERROR") + except: + pass + # Также пробуем обычное логирование + try: + error_msg = f"Неожиданная ошибка при запросе описания категории {category_id} из {desc_url}: {type(e).__name__}: {e}" + log_message(error_msg, "ERROR") + except: + pass # Пропускаем эту категорию и продолжаем обработку continue