Menulis kod pengendalian pengecualian yang berkesan adalah penting untuk mencipta aplikasi yang mantap dan boleh diselenggara.
Berikut ialah beberapa amalan terbaik untuk menulis kod pengendalian pengecualian dalam Python:
1. Tangkap Hanya Apa yang Boleh Anda Tangani
Tegaskan:
- Tangkap pengecualian khusus daripada menggunakan klausa kecuali luas.
- Ini memastikan bahawa hanya pengecualian yang anda jangkakan dan tahu cara mengendalikan ditangkap.
try:
# Code that might raise an exception
except ValueError as e:
print(f"Value error occurred: {e}")
Salin selepas log masuk
2. Elakkan Bare kecuali: Klausa
Tangkap pengecualian khusus:
- Elakkan menggunakan kecuali: tanpa menyatakan jenis pengecualian.
- Ini boleh menangkap ralat yang tidak dijangka dan menyukarkan penyahpepijatan.
try:
# Code that might raise an exception
except Exception as e: # Catch all exceptions if necessary
print(f"An error occurred: {e}")
Salin selepas log masuk
3. Gunakan cuba-kecuali-lain-akhirnya Blok
-
cuba: Letakkan kod yang mungkin menimbulkan pengecualian di sini.
-
kecuali: Mengendalikan pengecualian dalam blok ini.
-
else: Jalankan blok ini jika tiada pengecualian dibangkitkan dalam blok cuba.
-
akhirnya: Laksanakan blok ini tanpa mengira sama ada pengecualian telah dibangkitkan, selalunya digunakan untuk pembersihan.
try:
# Code that might raise an exception
except ValueError as e:
print(f"Value error: {e}")
else:
print("No exceptions occurred.")
finally:
print("This will always be executed.")
Salin selepas log masuk
4. Pengecualian Log
- Gunakan modul pengelogan untuk mengelog pengecualian.
- Pengelogan membantu mendiagnosis isu dalam pengeluaran tanpa mendedahkan ralat kepada pengguna akhir.
import logging
logging.basicConfig(level=logging.ERROR)
try:
# Code that might raise an exception
except Exception as e:
logging.error(f"An error occurred: {e}")
Salin selepas log masuk
5. Tingkatkan Semula Pengecualian Apabila Perlu
- Jika anda mendapat pengecualian tetapi tidak dapat mengendalikannya sepenuhnya, pertimbangkan untuk menaikkannya semula supaya ia boleh dikendalikan di tempat lain.
try:
# Code that might raise an exception
except ValueError as e:
logging.error(f"Value error: {e}")
raise # Re-raise the exception
Salin selepas log masuk
6. Gunakan Pengurus Konteks untuk Pengurusan Sumber
- Gunakan pengurus konteks (dengan pernyataan) untuk mengurus sumber seperti fail, soket atau sambungan pangkalan data.
- Ini memastikan sumber dikeluarkan dengan betul walaupun pengecualian dinaikkan.
with open('file.txt', 'r') as file:
content = file.read()
Salin selepas log masuk
7. Kemerosotan Anggun
-Daripada membenarkan aplikasi anda ranap, sediakan mekanisme sandaran atau mesej ralat mesra pengguna.
- Sebagai contoh, jika fail konfigurasi tiada, anda mungkin menggunakan tetapan lalai.
try:
with open('config.json', 'r') as file:
config = json.load(file)
except FileNotFoundError:
print("Config file not found, using defaults.")
config = {"default": "value"}
Salin selepas log masuk
8. Elakkan Pengecualian Menelan
- Jangan tangkap pengecualian tanpa mengambil sebarang tindakan.
- Mengabaikan pengecualian boleh menyembunyikan pepijat dan membuat aplikasi berkelakuan tidak dapat diramalkan.
try:
# Code that might raise an exception
except Exception as e:
pass # Bad practice - you're ignoring the error
Salin selepas log masuk
9. Pengecualian Dokumen
- Gunakan rentetan dokumen untuk mendokumentasikan pengecualian yang boleh dibangkitkan oleh fungsi anda.
- Ini membantu pembangun lain memahami pengecualian yang diharapkan dan cara mengendalikannya.
def divide(a, b):
"""
Divides two numbers.
:param a: Numerator.
:param b: Denominator.
:return: The result of the division.
:raises ZeroDivisionError: If the denominator is zero.
"""
if b == 0:
raise ZeroDivisionError("Cannot divide by zero.")
return a / b
Salin selepas log masuk
10. Gunakan Pengecualian Tersuai Apabila Sesuai
- Buat pengecualian tersuai untuk mewakili keadaan ralat tertentu dalam aplikasi anda.
- Ini boleh menjadikan kod anda lebih mudah dibaca dan lebih mudah diselenggara.
class InvalidInputError(Exception):
"""Exception raised for invalid inputs."""
pass
def process_input(value):
if not isinstance(value, int):
raise InvalidInputError("Input must be an integer.")
return value * 2
Salin selepas log masuk
11. Pengendalian Pengecualian Ujian
- Tulis ujian untuk memastikan pengendalian pengecualian anda berfungsi seperti yang diharapkan.
- Gunakan rangka kerja seperti unittest atau pytest untuk menguji kedua-dua kes biasa dan luar biasa.
def test_divide():
assert divide(10, 2) == 5
with pytest.raises(ZeroDivisionError):
divide(10, 0)
Salin selepas log masuk
12. Elakkan Penggunaan Terlalu Banyak Pengecualian
Gunakan pengecualian untuk kes luar biasa:
- Pengecualian harus digunakan untuk keadaan yang tidak dijangka, bukan sebagai mekanisme aliran kawalan biasa.
- Sebagai contoh, elakkan menggunakan pengecualian untuk mengendalikan keadaan yang boleh diramal seperti penghujung gelung.
# Bad practice: using exceptions for control flow
try:
while True:
value = next(iterator)
except StopIteration:
pass # End of iteration
Salin selepas log masuk
13. Pengecualian Rantaian untuk Konteks
- Python membenarkan anda merantai pengecualian untuk mengekalkan konteks asal apabila menimbulkan pengecualian baharu.
- Gunakan dari untuk memautkan pengecualian berkaitan.
try:
result = process_input(input_value)
except InvalidInputError as e:
raise ValueError("Failed to process input") from e
Salin selepas log masuk
Dengan mengikuti amalan terbaik ini, anda boleh menulis kod pengendalian pengecualian yang lebih mantap, boleh diselenggara dan boleh dibaca yang mengurus ralat dengan anggun dan meningkatkan kebolehpercayaan aplikasi anda.
resoures
- Dokumentasi Rasmi Python tentang Pengendalian Pengecualian
- Dokumentasi Modul pengelogan Python
- PEP 8 - Panduan Gaya untuk Kod Python (untuk amalan pengekodan umum termasuk pengecualian)
- Sawa Sebenar - Pengendalian Pengecualian
Atas ialah kandungan terperinci Amalan Terbaik untuk Melaksanakan Pengendalian Pengecualian dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!