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}")
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}")
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.")
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}")
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
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()
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"}
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
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
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
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)
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
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
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!