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.
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
Jika fungsi raise
menimbulkan pengecualian maka panggilan ke invoke_function()
tidak akan dilaksanakan dan sambungan DB akan tetap terbuka. Klausa
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>
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 kaedahimport 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>
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>
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.
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!