Mendefinisikan pengecualian tanpa parameter:
class MyException(Exception):
pass
Saat dinaikkan, apakah ada perbedaan antara:
raise MyException
dan
raise MyException()
Saya tidak dapat menemukannya; apakah itu hanya sintaks yang kelebihan beban?
Jawaban:
Jawaban singkatnya adalah keduanya
raise MyException
danraise MyException()
melakukan hal yang sama. Formulir pertama ini otomatis membuat pengecualian Anda.Bagian yang relevan dari dokumen mengatakan, " raise mengevaluasi ekspresi pertama sebagai objek pengecualian. Ini harus berupa subclass atau instance dari BaseException. Jika ini adalah kelas, instance pengecualian akan diperoleh saat diperlukan dengan membuat instance kelas dengan tidak ada argumen. "
Meskipun demikian, meskipun semantiknya sama, bentuk pertama lebih cepat secara mikroskopis, dan bentuk kedua lebih fleksibel (karena Anda dapat menyampaikan argumen jika diperlukan).
Gaya yang biasa digunakan kebanyakan orang dengan Python (yaitu di pustaka standar, di aplikasi populer, dan di banyak buku) akan digunakan
raise MyException
saat tidak ada argumen. Orang hanya membuat contoh pengecualian secara langsung jika ada beberapa argumen yang perlu diteruskan. Sebagai contoh:raise KeyError(badkey)
.sumber
Lihat dokumen untuk
raise
pernyataannya . Ini membuat instanceMyException
.sumber
raise
telah berubah sedikit di Python 3. Bagian yang relevan dengan pertanyaan ini adalah sama (raise ExceptionType
tetap membuat turunan dari tipe dengan memanggil konstruktornya tanpa argumen).Ya, ada perbedaan antara
ValueError
danValueError()
ValueError
adalah kelas sambilValueError()
membuat instance kelas. Inilah alasannyatype(ValueError) is type
dantype(ValueError()) is ValueError
Satu-satunya tujuan
raise
adalah untuk meningkatkan pengecualian,catatan:
raise ValueError # shorthand for 'raise ValueError()'
sumber