Kapan saya harus mensubklasifikasikan pengecualian dengan Python?

10

Dalam kode saya ada sekitar tujuh tempat di mana saya mengajukan pengecualian. Semua pengecualian ini diperlakukan sama: mencetak kesalahan ke file log, mengembalikan status perangkat lunak ke default dan keluar.

Saat meninjau kode insinyur senior saya, yang sangat saya hargai, mengatakan saya harus mensubklasifikasikan semua pengecualian ini. Argumennya adalah bahwa di masa depan kita mungkin ingin menangani pengecualian secara berbeda dan itu akan lebih mudah.

Argumen saya adalah bahwa saat ini hanya akan mengacaukan kode kita dan, karena kita tidak tahu apakah kita akan pernah menangani pengecualian secara berbeda, kita harus membiarkan kode itu terse dan, jika dan ketika saatnya tiba, maka dan hanya kemudian kita harus subtipe .

Saya ingin mendengar argumen apa pun untuk setiap kasus.

Ezra
sumber
2
YAGNI ... Anda tidak membutuhkannya sekarang dan Anda selalu dapat menambahkannya nanti tanpa terlalu banyak kesulitan.
Robert Harvey
Apakah Anda punya contoh? Apakah Anda hanya meningkatkan Exception, misalnya, atau kesalahan bawaan yang lebih spesifik?
jonrsharpe
hanya memunculkan Pengecualian ("deskripsi spesifik")
Ezra
@Ezra setidaknya, Anda harus melihat apakah ada pengecualian bawaan yang lebih pas (lihat docs.python.org/2/library/exceptions.html ).
jonrsharpe

Jawaban:

8

Kamu benar

Argumen untuk pihak Anda sudah disebutkan oleh Robert Harvey: jangan tambahkan kode yang tidak Anda butuhkan saat ini, terutama karena mudah untuk menambahkannya nanti.

Peninjau Anda juga benar

Di sisi lain, poin peninjau dapat dimengerti juga:

  • Mengembalikan generik Exception()tidak terlalu membantu penelepon: sementara deskripsi pengecualian menunjukkan kepada manusia apa yang terjadi, memperlakukan pengecualian secara terprogram mungkin tidak mungkin dilakukan. Pengembang yang menggunakan kode Anda mungkin enggan mengubah jenis pengecualian , termasuk karena takut (dibenarkan atau tidak) melanggar sesuatu.

    Perhatikan bahwa menambahkan pengecualian khusus saat ini tidak terlalu sulit :

    class MyCustomException(Exception):
        pass

    itu yang kamu butuhkan. Itu hanya dua baris kode (mengingat Anda bahkan mungkin tidak perlu membuat file terpisah jika Anda memasukkan pengecualian khusus dalam satu file).

  • Kode itu sendiri terlihat lebih baik, lebih mudah dibaca.

    if price < self.PriceMinValue:
        raise OutOfRangeException("The price is inferior to zero.")

    terlihat sedikit lebih mudah dibaca dibandingkan dengan:

    if price < self.PriceMinValue:
        raise Exception("The price is inferior to zero.")

    karena indikasi jenis pengecualian:

    • Pada potongan kode kedua, saya perlu membaca deskripsi dan menebak bahwa harganya di luar kisaran (atau mungkin tidak? Mungkin ada kasus di mana harga bisa negatif, seperti rabat?)

    • Pada potongan kode pertama, pandangan sekilas atas tipe tersebut memberikan indikasi langsung tentang kesalahan tersebut. Sepertinya ada satu set nilai yang diizinkan untuk suatu harga, dan nilai saat ini di luar set ini.

Begitu?

Begitu:

  • Kedua pendekatan itu valid. Jika Anda tidak mensubklasifikasikan pengecualian saat Anda tidak memerlukan jenis khusus, Anda benar. Ketika Anda melakukan subkelas pengecualian karena tidak ada biaya untuk melakukannya dan mungkin berguna nanti, Anda benar.

  • Konsisten dengan tim Anda. Jika tim Anda menggunakan pengecualian khusus secara luas, gunakan itu.

Arseni Mourzenko
sumber
2
Tapi ada happy medium: raise ValueError('The price is less than zero'). Ini lebih spesifik daripada pangkalan Exception, tetapi tanpa keributan.
jonrsharpe
+1 untuk pernyataan sederhana "konsisten", dengan tim jika Anda memilikinya, dengan diri Anda sendiri jika tidak.
Styne666