""" Урок 51. Summary session 13 — весь код примеров одним файлом. Источник: subjects/python-fundamentals/course/lessons/51-summary-session-13/examples.html Файл собран автоматически (tools/build_lesson_examples.py): правьте страницу урока. Запуск: python lesson-51.py """ # ==================================================================== # Пример 1. Базовый try/except # ==================================================================== # example_01_basic.py try: result = 10 / 0 print("Эта строка не выполнится") except ZeroDivisionError: print("Ошибка: деление на ноль!") print("Программа продолжает работу") # Ошибка: деление на ноль! # Программа продолжает работу # ==================================================================== # Пример 2. Конкретное исключение vs «голый» except # ==================================================================== # example_02a_bare_except.py — так делать нельзя try: number = int("abc") except: print("Что-то пошло не так") print("Программа продолжает работу, но причина ошибки скрыта") # Что-то пошло не так # Программа продолжает работу, но причина ошибки скрыта # ==================================================================== # Пример 2. Конкретное исключение vs «голый» except # ==================================================================== # example_02b_broad_exception.py — лучше, но всё ещё расплывчато try: number = int("abc") except Exception as e: print(f"Ошибка: {type(e).__name__}: {e}") # Ошибка: ValueError: invalid literal for int() with base 10: 'abc' # ==================================================================== # Пример 2. Конкретное исключение vs «голый» except # ==================================================================== # example_02c_specific.py — правильно try: number = int("abc") except ValueError as e: print(f"Некорректное значение: {e}") # Некорректное значение: invalid literal for int() with base 10: 'abc' # ==================================================================== # Пример 3. Несколько except: порядок проверки важен # ==================================================================== # example_03_order.py def safe_divide(a, b): try: return a / b except ZeroDivisionError: print("Деление на ноль") except TypeError: print("Неверный тип операндов") except Exception as e: print(f"Другая ошибка: {type(e).__name__}: {e}") print(safe_divide(10, 0)) print(safe_divide(10, "2")) print(safe_divide(10, 2)) # Деление на ноль # None # Неверный тип операндов # None # 5.0 # ==================================================================== # Пример 4. Один except на несколько типов через кортеж # ==================================================================== # example_04_tuple_except.py def to_int(value): try: return int(value) except (ValueError, TypeError) as e: print(f"Не удалось преобразовать {value!r}: {type(e).__name__}: {e}") return None print(to_int("42")) print(to_int("abc")) print(to_int(None)) # 42 # Не удалось преобразовать 'abc': ValueError: invalid literal for int() with base 10: 'abc' # None # Не удалось преобразовать None: TypeError: int() argument must be a string, a bytes-like object or a real number, not 'NoneType' # None # ==================================================================== # Пример 5. Полная конструкция try/except/else/finally # ==================================================================== # example_05_full.py try: number = int(input("Введите число: ")) result = 10 / number except ValueError: print("Некорректное значение.") except ZeroDivisionError: print("Деление на ноль.") else: print(f"Результат: {result}") finally: print("Программа завершена.") # ввод "abc": Некорректное значение. / Программа завершена. # ввод "0": Деление на ноль. / Программа завершена. # ввод "5": Результат: 2.0 / Программа завершена. # ==================================================================== # Пример 6. raise и повторный запрос ввода # ==================================================================== # example_06_raise.py while True: try: number = int(input("Введите положительное число: ")) if number < 0: raise ValueError("Число не может быть отрицательным") print(f"Принято: {number}") break except ValueError as e: print(f"Ошибка: {e}. Попробуйте снова.") # ввод "-3", затем "5": # Ошибка: Число не может быть отрицательным. Попробуйте снова. # Принято: 5 # ==================================================================== # Пример 7. Логирование ошибок в файл # ==================================================================== # example_07_logging.py import logging logging.basicConfig( filename="app.log", format="%(asctime)s - %(filename)s - %(lineno)d - %(levelname)s - %(message)s", level=logging.ERROR, ) try: result = 10 / 0 except ZeroDivisionError as e: logging.error(f"Ошибка при делении: {e}") print("Произошла ошибка, подробности в app.log") # Произошла ошибка, подробности в app.log # содержимое app.log: # 2026-08-13 21:07:59,591 - example_07_logging.py - 12 - ERROR - Ошибка при делении: division by zero # ==================================================================== # Пример 8. os.path: проверка и сборка путей, os.makedirs # ==================================================================== # example_08_paths.py import os filename = "example.txt" print("Существует:", os.path.exists(filename)) print("Это файл:", os.path.isfile(filename)) print("Абсолютный путь:", os.path.abspath(filename)) print("Имя файла:", os.path.basename("/home/user/docs/file.txt")) print("Директория:", os.path.dirname("/home/user/docs/file.txt")) print("Соединённый путь:", os.path.join("folder", "subfolder", "file.txt")) os.makedirs("archive/2026/reports", exist_ok=True) print("Папка создана:", os.path.isdir("archive/2026/reports")) os.makedirs("archive/2026/reports", exist_ok=True) # повторный вызов — без ошибки print("Повторный вызов не упал") # Существует: True # Это файл: True # Абсолютный путь: C:\...\examples-51\example.txt # Имя файла: file.txt # Директория: /home/user/docs # Соединённый путь: folder\subfolder\file.txt # Папка создана: True # Повторный вызов не упал # ==================================================================== # Пример 9. Абсолютный и относительный путь # ==================================================================== # example_09_abs_vs_rel.py import os print("Текущая директория (os.getcwd):", os.getcwd()) relative = "project/notes.txt" absolute = os.path.abspath(relative) print("Относительный путь:", relative) print("Абсолютный путь: ", absolute) print("Это один и тот же файл:", os.path.exists(relative) == os.path.exists(absolute)) # Текущая директория (os.getcwd): C:\...\examples-51 # Относительный путь: project/notes.txt # Абсолютный путь: C:\...\examples-51\project\notes.txt # Это один и тот же файл: True # ==================================================================== # Пример 10. Рекурсивный обход: os.walk # ==================================================================== # example_10_walk.py import os extension = ".txt" for root, dirs, files in os.walk("project"): for file in files: if file.endswith(extension): full_path = os.path.join(root, file) print(f"Найден файл: {full_path}") # Найден файл: project\broken.txt # Найден файл: project\notes.txt # Найден файл: project\report.txt # Найден файл: project\subdir\log.txt # ==================================================================== # Пример 11. Связка тем: безопасный обход папки с обработкой ошибок чтения # ==================================================================== # example_11_walk_try.py import os report_lines = 0 for root, dirs, files in os.walk("project"): for file in files: if not file.endswith(".txt"): continue full_path = os.path.join(root, file) try: with open(full_path, "r", encoding="utf-8") as f: content = f.read() except UnicodeDecodeError as e: print(f"Пропускаю {full_path}: не удалось прочитать как текст ({e})") continue except OSError as e: print(f"Пропускаю {full_path}: ошибка доступа ({e})") continue report_lines += len(content.splitlines()) print(f"Прочитан {full_path}: {len(content.splitlines())} стр.") print(f"Всего успешно прочитано строк: {report_lines}") # Пропускаю project\broken.txt: не удалось прочитать как текст ('utf-8' codec can't decode byte 0xff in position 0: invalid start byte) # Прочитан project\notes.txt: 1 стр. # Прочитан project\report.txt: 1 стр. # Прочитан project\subdir\log.txt: 1 стр. # Всего успешно прочитано строк: 3 # ==================================================================== # Пример 12. Аргументы командной строки: sys.argv # ==================================================================== # example_12_argv.py import sys print("Все аргументы:", sys.argv) if len(sys.argv) != 2: print("Использование: python example_12_argv.py <имя_файла>") sys.exit(1) target = sys.argv[1] print(f"Ищем файл: {target}") # запуск "python example_12_argv.py" (без аргументов): # Все аргументы: ['example_12_argv.py'] # Использование: python example_12_argv.py <имя_файла> # запуск "python example_12_argv.py data.txt": # Все аргументы: ['example_12_argv.py', 'data.txt'] # Ищем файл: data.txt