Exceção controle
Execute uma análise estática limitada para exceções não capturadas em um arquivo python.
Este é um ️ WIP ️ . Confira o comportamento testado, o comportamento e as limitações não testadas.
Uso
Para verificar se há exceções não capturadas em um arquivo python:
python3 main.py [filename]
O suporte a vários arquivos é limitado, mas você pode tentar o seguinte:
python3 main.py <(cat [file1] [file2]...)
Comportamento testado
O comportamento a seguir foi verificado para os arquivos de teste incluídos testes/test.py e tests/test2.py:
- Detecta exceções levantadas manualmente pelas funções (
raise Exception ). - Detecta exceções levantadas chamando funções fora dos blocos Try-Except, incluindo funções definidas pelo usuário que aumentam as exceções, bem como algumas funções python embutidas como
open() . - Detecta exceções levantadas pelo uso de operadores como indexação
arr[index] e dividir a / b ou a // b . - Exclui exceções capturadas,
except Exception: cláusulas do relatório e entende a hierarquia de exceção. - Exclui exceções documentadas na função Docstrings do relatório.
Comportamento não testado
- Pode falhar com os blocos de tentativa aninhada.
- Testes mais extensos precisam ser feitos para detectar limitações adicionais.
Limitações
- Perderá muitas exceções:
- Devido ao Python ser uma linguagem dinâmica com digitação de pato, há muitas exceções que não podem ser detectadas estaticamente.
- As exceções levantadas pelas funções mais populares não são documentadas e, portanto, não são visíveis do lado de fora.
- Exceções são armazenadas pelo nome. Se houver
TypeError múltiplo em uma função, apenas a última será relatada.
- Relatará exceções, mesmo que nunca sejam criadas na execução:
- Por ser uma ferramenta de análise estática, ele não segue uma variável ao longo do código ou determina seus valores possíveis.
- É por isso que as exceções serão relatadas para qualquer operações de indexação ou divisão, independentemente de serem "seguras" ou não.
- Não funciona bem com classes ou exceções personalizadas:
- Pode haver muitas classes em um único documento com métodos em diferentes classes compartilhando o mesmo nome.
- Existem muitas maneiras de instanciar uma classe e chamar seus métodos.
- É, em alguns casos, impossível determinar a classe de uma variável e a função chamada usando análise estática.
- Não suporta bibliotecas externas:
- As bibliotecas externas não são suportadas, mas o código é extensível o suficiente para possibilitar incluí -las no futuro.
- O suporte para vários arquivos é limitado:
- O suporte para vários arquivos é feito através da substituição do processo Bash.
python3 main.py <(cat [file1] [file2]...) - Os números de linha serão relativos aos arquivos mesclados e não por arquivo.
- As funções são pesquisadas por nome, então as funções renomeadas
from <module> import <function> as <new_name> não serão detectadas.