Jika Anda melihat dokumentasi untuk kesalahan bawaan , Anda akan melihat bahwa sebagian besar Exception
kelas menetapkan argumen pertama mereka sebagai message
atribut. Tidak semua dari mereka melakukannya.
Khususnya, EnvironmentError
(dengan subclass IOError
dan OSError
) memiliki argumen pertama errno
, kedua strerror
. Tidak ada message
... yang strerror
secara kasar analog dengan apa yang biasanya menjadi message
.
Secara umum, subkelas dari Exception
dapat melakukan apapun yang mereka inginkan. Mereka mungkin memiliki atau tidak memiliki message
atribut. Bawaan masa depan Exception
mungkin tidak memiliki message
atribut. Setiap Exception
subclass yang diimpor dari pustaka pihak ketiga atau kode pengguna mungkin tidak memiliki message
atribut.
Saya pikir cara yang tepat untuk menangani ini adalah dengan mengidentifikasi Exception
subclass spesifik yang ingin Anda tangkap, dan kemudian hanya menangkap subclass tersebut, bukan semuanya dengan an except Exception
, lalu gunakan atribut apa pun yang ditentukan oleh subclass tertentu seperti yang Anda inginkan.
Jika Anda memerlukan print
sesuatu, saya pikir mencetak hasil tangkapan Exception
itu sendiri kemungkinan besar akan melakukan apa yang Anda inginkan, apakah itu memiliki message
atribut atau tidak.
Anda juga dapat memeriksa atribut pesan jika Anda mau, seperti ini, tetapi saya tidak akan menyarankannya karena tampaknya berantakan:
try:
pass
except Exception as e:
if hasattr(e, 'message'):
print(e.message)
else:
print(e)
except Foo as bar:
sama denganexcept Foo, bar:
(kecuali yang pertama lebih baru, dan akan terus berfungsi di 3.x), apakah kesalahan datang denganmessage
atribut atau tidak terpisah.