Saya bertanya-tanya tentang praktik terbaik untuk menunjukkan kombinasi argumen yang tidak valid dalam Python. Saya telah menemukan beberapa situasi di mana Anda memiliki fungsi seperti:
def import_to_orm(name, save=False, recurse=False):
"""
:param name: Name of some external entity to import.
:param save: Save the ORM object before returning.
:param recurse: Attempt to import associated objects as well. Because you
need the original object to have a key to relate to, save must be
`True` for recurse to be `True`.
:raise BadValueError: If `recurse and not save`.
:return: The ORM object.
"""
pass
Satu-satunya gangguan dengan ini adalah bahwa setiap paket memiliki sendiri, biasanya sedikit berbeda BadValueError
. Saya tahu bahwa di Jawa ada java.lang.IllegalArgumentException
- apakah dipahami bahwa semua orang akan membuat sendiri BadValueError
dengan Python atau ada metode lain yang disukai?
math.sqrt(-1)
, itu adalah kesalahan pemrograman yang perlu diperbaiki.ValueError
tidak dimaksudkan untuk ditangkap dalam pelaksanaan program normal atau itu akan berasal dariRuntimeError
.Saya akan mewarisi dari
ValueError
Terkadang lebih baik untuk membuat pengecualian Anda sendiri, tetapi mewarisi dari bawaan, yang sedekat mungkin dengan apa yang Anda inginkan.
Jika Anda perlu mengetahui kesalahan spesifik itu, sebaiknya memiliki nama.
sumber
Saya pikir cara terbaik untuk menangani ini adalah cara python sendiri menanganinya. Python memunculkan TypeError. Sebagai contoh:
Dev junior kami baru saja menemukan halaman ini di pencarian google untuk "argumen salah python exception" dan saya terkejut bahwa jawaban yang jelas (untuk saya) tidak pernah disarankan dalam dekade sejak pertanyaan ini diajukan.
sumber
int('a')
). sumbersum()
tanpa argumen, yang merupakanTypeError
, tetapi OP khawatir dengan kombinasi nilai argumen "ilegal" ketika jenis argumen benar. Dalam hal ini, keduanyasave
danrecurse
bools, tetapi jikarecurse
ituTrue
makasave
seharusnya tidak bolehFalse
. Ini adalahValueError
. Saya setuju bahwa beberapa interpretasi dari judul pertanyaan akan dijawab olehTypeError
, tetapi tidak untuk contoh yang disajikan.Saya sebagian besar baru saja melihat builtin
ValueError
digunakan dalam situasi ini.sumber
Itu tergantung pada apa masalahnya dengan argumen itu.
Jika argumen memiliki tipe yang salah, naikkan TypeError. Misalnya, ketika Anda mendapatkan string, bukan salah satu Boolean tersebut.
Perhatikan, bagaimanapun, bahwa dalam Python kita jarang melakukan pemeriksaan seperti ini. Jika argumen tersebut benar-benar tidak valid, beberapa fungsi yang lebih dalam mungkin akan melakukan komplain untuk kita. Dan jika kita hanya memeriksa nilai boolean, mungkin beberapa pengguna kode nantinya hanya akan memberinya string yang mengetahui bahwa string yang tidak kosong selalu Benar. Mungkin menyelamatkannya gips.
Jika argumen memiliki nilai yang tidak valid, naikkan ValueError. Ini tampaknya lebih sesuai untuk kasus Anda:
Atau dalam kasus khusus ini, memiliki nilai True recurse menyiratkan nilai True save. Karena saya akan menganggap ini sebagai pemulihan dari kesalahan, Anda mungkin juga ingin mengeluh dalam log.
sumber
Saya tidak yakin saya setuju dengan warisan dari
ValueError
- interpretasi saya dari dokumentasi adalah bahwaValueError
ini hanya seharusnya dibesarkan oleh builtin ... mewarisi dari itu atau menaikkan sendiri sepertinya tidak benar.- Dokumentasi ValueError
sumber
ValueError
untuk hal semacam ini, jadi saya pikir Anda mencoba membaca terlalu banyak ke dalam dokumentasi.Setuju dengan saran Markus untuk melempar pengecualian Anda sendiri, tetapi teks pengecualian harus menjelaskan bahwa masalahnya ada dalam daftar argumen, bukan nilai argumen individual. Saya akan mengusulkan:
Digunakan ketika argumen kata kunci hilang yang diperlukan untuk panggilan tertentu, atau nilai argumen secara individual valid tetapi tidak konsisten satu sama lain.
ValueError
masih akan benar ketika argumen tertentu adalah tipe yang benar tetapi di luar jangkauan.Bukankah ini harus menjadi pengecualian standar dalam Python?
Secara umum, saya ingin gaya Python menjadi sedikit lebih tajam dalam membedakan input buruk ke fungsi (kesalahan pemanggil) dari hasil buruk dalam fungsi (kesalahan saya). Jadi mungkin juga ada BadArgumentError untuk membedakan kesalahan nilai dalam argumen dari kesalahan nilai di lokal.
sumber
KeyError
kata kunci yang tidak ditemukan (karena kata kunci eksplisit yang hilang secara semantik identik dengan**kwargs
dikt yang tidak memiliki kunci itu).