Rumah >pembangunan bahagian belakang >Tutorial Python >Pengendalian ralat profesional dengan python

Pengendalian ralat profesional dengan python

Jennifer Aniston
Jennifer Anistonasal
2025-03-04 10:58:19374semak imbas

Dalam tutorial ini, anda akan belajar bagaimana menangani keadaan ralat di Python dari sudut pandang keseluruhan sistem. Pengendalian ralat adalah aspek kritikal reka bentuk, dan ia melintasi dari tahap terendah (kadang -kadang perkakasan) sepanjang jalan ke pengguna akhir. Sekiranya anda tidak mempunyai strategi yang konsisten, sistem anda tidak boleh dipercayai, pengalaman pengguna akan menjadi miskin, dan anda akan mempunyai banyak cabaran yang menyahpepijat dan penyelesaian masalah. Model: Kod status dan pengecualian. Kod status boleh digunakan oleh mana -mana bahasa pengaturcaraan. Pengecualian memerlukan sokongan bahasa/runtime.

Python menyokong pengecualian. Python dan pengecualian penggunaan perpustakaan standardnya secara bebas untuk melaporkan banyak situasi yang luar biasa seperti kesilapan IO, membahagikan sifar, daripada pengindeksan batas, dan juga beberapa situasi yang tidak begitu luar biasa seperti akhir lelaran (walaupun tersembunyi). Kebanyakan perpustakaan mengikutinya dan menaikkan pengecualian. Tindakan:

Berikut adalah output apabila memanggil cuba

klausa. Sekiranya tiada pengecualian berlaku, program melangkaui klausa . 

Jika anda memasukkan nombor keseluruhan, program ini berfungsi seperti yang diharapkan. Walau bagaimanapun, jika anda memasukkan apungan atau rentetan, program berhenti melaksanakan. Asal. Jika parser JSON menimbulkan pengecualian bahawa fail itu bukan fail JSON yang sah, anda menelannya dan cuba dengan parser yaml. Sekiranya parser YAML gagal, maka anda akan membiarkan pengecualian menyebarkan. Ini adalah dasar yang baik dalam kes ini di mana anda ingin mencuba penguraian YAML hanya jika parsing JSON gagal kerana isu pengekodan JSON. Contohnya:
def f():<br>    return 4 / 0<br>def g():<br>    raise Exception("Don't call us. We'll call you")<br>def h():<br>    try:<br>        f()<br>    except Exception as e:<br>        print(e)<br>    <br>    try:<br>        g()<br>    except Exception as e:<br>        print(e)<br>

Perhatikan bahawa dengan menambah as e, anda mengikat objek pengecualian ke nama e yang tersedia dalam klausa kecuali anda. Ini membolehkan anda melakukan beberapa pengendalian tempatan, tetapi masih membolehkan tahap atas mengendalikannya juga. Di sini, fungsi

mencetak jenis pengecualian ke konsol dan kemudian menimbulkan pengecualian sekali lagi. Kadang-kadang anda ingin mengumpulkan pelbagai pengecualian peringkat rendah yang berbeza ke dalam satu kategori yang ditangani secara seragam oleh kod peringkat tinggi. Agar kes, anda perlu mengubah pengecualian ke tahap pengguna dan menyediakan beberapa konteks khusus aplikasi. Sebagai contoh, anda mungkin mempunyai sambungan pangkalan data yang anda mahu tutup sebaik sahaja anda selesai. Berikut adalah cara yang salah untuk melakukannya:

Jika fungsi raise menimbulkan pengecualian maka panggilan ke invoke_function() tidak akan dilaksanakan dan sambungan DB akan tetap terbuka. Klausa

sentiasa dilaksanakan selepas cuba semua pengendali pengecualian dilaksanakan. Inilah cara untuk melakukannya dengan betul:
Please enter a number: 10.3<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: hello<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: 10.0<br>Oops!  That was no valid number.  Try again...<br>Please enter a number: <br>

Panggilan ke

tidak boleh mengembalikan sambungan atau menaikkan pengecualian itu sendiri. Dalam kes ini tidak perlu menutup sambungan DB. Daripada blok cuba-akhir-akhir, anda menggunakan pernyataan

. Berikut adalah contoh dengan fail:

Ia amat berguna dalam aplikasi web di mana anda boleh merawat semua pengecualian dengan cara generik: hanya log pengecualian dan mengembalikan mesej ralat kepada pemanggil. Semua maklumat ini boleh didapati melalui objek

, tetapi jika anda menggunakan kaedah
import json<br>import yaml<br><br>def parse_file(filename):<br>    try:<br>        return json.load(open(filename))<br>    except json.JSONDecodeError<br>        return yaml.load(open(filename))<br>
dalam pengendali pengecualian anda, sistem pembalakan Python akan mengekstrak semua maklumat yang relevan untuk anda.

Ini adalah amalan terbaik yang saya cadangkan:

def f():<br>    return 4 / 0<br>def g():<br>    raise Exception("Don't call us. We'll call you")<br>def h():<br>    try:<br>        f()<br>    except Exception as e:<br>        print(e)<br>    <br>    try:<br>        g()<br>    except Exception as e:<br>        print(e)<br>
Jika anda mengikuti corak ini kemudian (dengan mengandaikan anda menyediakan pembalakan dengan betul) tidak kira apa yang berlaku, anda akan mempunyai rekod yang cukup baik dalam log anda tentang apa yang salah, dan anda akan dapat menyelesaikan masalah ini. Ia adalah sisa, dan ia mungkin mengelirukan anda dan membuat anda berfikir banyak contoh masalah yang sama berlaku, apabila dalam amalan satu contoh telah log masuk beberapa kali. Aplikasi/Sistem.

Sentry

Pembalakan adalah keupayaan. Pelaksanaan yang paling biasa adalah menggunakan fail log. Tetapi, untuk sistem yang diedarkan secara besar-besaran dengan beratus-ratus, beribu-ribu atau lebih pelayan, ini tidak semestinya penyelesaian terbaik. Ia memusatkan semua laporan pengecualian, dan sebagai tambahan kepada stacktrace ia menambah keadaan setiap bingkai timbunan (nilai pembolehubah pada masa pengecualian dinaikkan). Ia juga menyediakan antara muka yang sangat bagus dengan papan pemuka, laporan, dan cara untuk memecahkan mesej oleh pelbagai projek. Ia adalah sumber terbuka, jadi anda boleh menjalankan pelayan anda sendiri atau melanggan versi yang dihoskan. Sistem yang terkejut pada tanda pertama masalah tidak begitu berguna.

Jika kod anda mengakses beberapa sistem jauh yang tidak bertindak balas, penyelesaian tradisional adalah masa tamat, tetapi kadang -kadang tidak setiap sistem direka dengan masa tamat. Timeouts tidak semestinya mudah dikalibrasi apabila keadaan berubah.

Pendekatan lain adalah gagal dengan cepat dan kemudian cuba lagi. Manfaatnya ialah jika sasaran bertindak balas dengan cepat maka anda tidak perlu menghabiskan banyak masa dalam keadaan tidur dan dapat bertindak balas dengan segera. Tetapi jika ia gagal, anda boleh mencuba beberapa kali sehingga anda memutuskan ia benar -benar tidak dapat dicapai dan menimbulkan pengecualian. Di bahagian seterusnya, saya akan memperkenalkan penghias yang boleh melakukannya untuk anda.

ralat logger

Berikut adalah pelaksanaan yang mudah. Penghias kecuali objek Logger. Apabila ia menghiasi fungsi dan fungsi dipanggil, ia akan membungkus panggilan dalam klausa percubaan cuba, dan jika terdapat pengecualian, ia akan log dan akhirnya menaikkan pengecualian lagi. Pengendalian. Python memberikan sokongan hebat dalam bahasa dan perpustakaan standard untuk pengendalian ralat berasaskan pengecualian. Dengan mengikuti amalan terbaik dengan tekun, anda boleh menaklukkan aspek ini yang sering diabaikan. Esther adalah pemaju dan penulis perisian untuk Envato Tuts.

def f():<br>    return 4 / 0<br>def g():<br>    raise Exception("Don't call us. We'll call you")<br>def h():<br>    try:<br>        f()<br>    except Exception as e:<br>        print(e)<br>    <br>    try:<br>        g()<br>    except Exception as e:<br>        print(e)<br>

Atas ialah kandungan terperinci Pengendalian ralat profesional dengan python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Cara membaca dan menulis fail CSV di PythonArtikel seterusnya:tiada