Pengendalian Pengecualian
Lakukan analisis statis terbatas untuk pengecualian yang tidak tertulis dalam file python.
Ini adalah ️ WIP ️ . Lihat perilaku yang diuji, perilaku dan keterbatasan yang belum diuji.
Penggunaan
Untuk memeriksa pengecualian yang tidak dibawa dalam file Python:
python3 main.py [filename]
Dukungan beberapa file terbatas, tetapi Anda dapat mencoba ini:
python3 main.py <(cat [file1] [file2]...)
Perilaku yang diuji
Perilaku berikut telah diverifikasi untuk Tes File Uji yang disertakan/test.py dan test/test2.py:
- Mendeteksi pengecualian yang diangkat secara manual berdasarkan fungsi (
raise Exception ). - Mendeteksi pengecualian yang diajukan dengan memanggil fungsi di luar blok percobaan-kecuali, termasuk fungsi yang ditentukan pengguna yang meningkatkan pengecualian, serta beberapa fungsi python bawaan seperti
open() . - Mendeteksi pengecualian yang diajukan dengan menggunakan operator seperti indeks
arr[index] dan membagi a / b atau a // b . - Tidak termasuk pengecualian yang terperangkap
except Exception: klausa dari laporan dan memahami hierarki pengecualian. - Tidak termasuk pengecualian yang didokumentasikan dalam fungsi Docstrings dari laporan.
Perilaku yang belum teruji
- Mungkin gagal dengan percobaan bersarang/kecuali blok.
- Pengujian yang lebih luas perlu dilakukan untuk mendeteksi batasan tambahan.
Batasan
- Akan kehilangan banyak pengecualian:
- Karena Python menjadi bahasa dinamis dengan pengetikan bebek, ada banyak pengecualian yang tidak dapat dideteksi secara statis.
- Pengecualian yang diangkat oleh sebagian besar fungsi populer tidak berdokumen dan karenanya tidak terlihat dari luar.
- Pengecualian disimpan dengan nama. Jika ada beberapa
TypeError dalam suatu fungsi, hanya yang terakhir yang akan dilaporkan.
- Akan melaporkan pengecualian bahkan jika mereka tidak akan pernah diangkat dalam eksekusi:
- Karena itu menjadi alat analisis statis, ia tidak mengikuti variabel di sepanjang kode atau menentukan nilainya yang mungkin.
- Itulah sebabnya, pengecualian akan dilaporkan untuk setiap operasi pengindeksan atau divisi terlepas dari apakah mereka "aman" atau tidak.
- Tidak bekerja dengan baik dengan kelas atau pengecualian khusus:
- Mungkin ada banyak kelas dalam satu dokumen dengan metode di kelas yang berbeda yang berbagi nama yang sama.
- Ada banyak cara untuk instantiate kelas dan memanggil metodenya.
- Dalam beberapa kasus, tidak mungkin untuk menentukan kelas variabel dan fungsi yang disebut menggunakan analisis statis.
- Tidak mendukung perpustakaan eksternal:
- Perpustakaan eksternal tidak didukung, tetapi kode ini cukup dapat diperluas untuk memungkinkan untuk memasukkannya di masa depan.
- Dukungan untuk beberapa file terbatas:
- Dukungan untuk beberapa file dilakukan melalui substitusi proses bash.
python3 main.py <(cat [file1] [file2]...) - Nomor baris akan relatif terhadap file gabungan dan bukan per file.
- Fungsi dicari berdasarkan nama, jadi ganti nama fungsi
from <module> import <function> as <new_name> tidak akan terdeteksi.