Развёрнутое пояснение
1️⃣Вызов 𝚒𝚗𝚝("𝚊𝚋𝚌") выбрасывает 𝚅𝚊𝚕𝚞𝚎𝙴𝚛𝚛𝚘𝚛, потому что строка не является числом.
2️⃣Python идёт по 𝚎𝚡𝚌𝚎𝚙𝚝-блокам сверху вниз и проверяет, является ли выброшенное исключение экземпляром указанного класса.
3️⃣Первый блок ловит 𝙴𝚡𝚌𝚎𝚙𝚝𝚒𝚘𝚗; так как 𝚅𝚊𝚕𝚞𝚎𝙴𝚛𝚛𝚘𝚛 наследуется от 𝙴𝚡𝚌𝚎𝚙𝚝𝚒𝚘𝚗, условие выполняется, печатается A, и обработка завершается.
4️⃣Блок 𝚎𝚡𝚌𝚎𝚙𝚝 𝚅𝚊𝚕𝚞𝚎𝙴𝚛𝚛𝚘𝚛 становится «мёртвым кодом» — он никогда не выполнится.
Почему это важно
Правило: более специфичные исключения должны идти перед более общими. Иначе общий 𝚎𝚡𝚌𝚎𝚙𝚝 «съест» все ошибки, и специфичная обработка не сработает. В современном Python (3.11+) на это даже выдаётся SyntaxWarning. Да pyright подсветит, но в учебном примере я специально убрал подсветку.
Post #4579
863
- ✍ 1