Контроль исключений
Выполните ограниченный статический анализ для нехваченных исключений в файле Python.
Это ️ Пари ️ Полем Проверьте тестируемое поведение, непроверенное поведение и ограничения.
Использование
Чтобы проверить на наличие непредучанных исключений в файле Python:
python3 main.py [filename]
Поддержка нескольких файлов ограничена, но вы можете попробовать это:
python3 main.py <(cat [file1] [file2]...)
Протестированное поведение
Следующее поведение было подтверждено для включенных тестовых файлов тестирования/test.py и tests/test2.py:
- Обнаружает исключения вручную, поднятые функциями (
raise Exception ). - Обнаружает исключения, поднятые путем вызова функций вне блоков Try-Except, включая пользовательские функции, которые повышают исключения, а также некоторые встроенные функции Python, такие как
open() . - Обнаружает исключения, поднятые с использованием операторов, таких как индексация
arr[index] и разделение a / b или a // b . - Исключает исключения, попавшие в
except Exception: положения из отчета и понимают иерархию исключения. - Исключает исключения, задокументированные в функциях Docstrings из отчета.
Непроверенное поведение
- Может потерпеть неудачу с вложенной попыткой/кроме блоков.
- Необходимо провести более широкое тестирование для выявления дополнительных ограничений.
Ограничения
- Будет пропустить много исключений:
- Из -за того, что Python является динамичным языком с набором уток, существует много исключений, которые не могут быть обнаружены статически.
- Исключения, поднятые наиболее популярными функциями, недокументированы и, следовательно, не видны снаружи.
- Исключения хранятся по имени. Если в функции есть несколько
TypeError , только последнее будет сообщено.
- Сообщит о исключениях, даже если они никогда не будут подниматься в исполнении:
- Из -за того, что он является инструментом статического анализа, он не следит за переменной вдоль кода и не определяет его возможные значения.
- Вот почему исключения будут представлены для любых операций по индексации или деления независимо от того, являются ли они «безопасными» или нет.
- Не очень хорошо работает с классами или пользовательскими исключениями:
- В одном документе может быть много классов с методами в разных классах, разделяющих одно и то же имя.
- Есть много способов создания класса и назвать его методы.
- В некоторых случаях невозможно определить класс переменной и функцию, называемую статическим анализом.
- Не поддерживает внешние библиотеки:
- Внешние библиотеки не поддерживаются, но код достаточно расширяется, чтобы сделать их в будущем.
- Поддержка нескольких файлов ограничена:
- Поддержка нескольких файлов осуществляется посредством замены процесса Bash.
python3 main.py <(cat [file1] [file2]...) - Номера строк будут относительно объединенных файлов, а не для каждого файла.
- Функции ищут по имени, поэтому переименованные функции
from <module> import <function> as <new_name> не будет обнаружено.