Jika Anda melihat dokumentasi untuk kesalahan bawaan , Anda akan melihat bahwa sebagian besar Exceptionkelas menetapkan argumen pertama mereka sebagai messageatribut. Tidak semua dari mereka melakukannya.
Khususnya, EnvironmentError(dengan subclass IOErrordan OSError) memiliki argumen pertama errno, kedua strerror. Tidak ada message... yang strerrorsecara kasar analog dengan apa yang biasanya menjadi message.
Secara umum, subkelas dari Exceptiondapat melakukan apapun yang mereka inginkan. Mereka mungkin memiliki atau tidak memiliki messageatribut. Bawaan masa depan Exceptionmungkin tidak memiliki messageatribut. Setiap Exceptionsubclass yang diimpor dari pustaka pihak ketiga atau kode pengguna mungkin tidak memiliki messageatribut.
Saya pikir cara yang tepat untuk menangani ini adalah dengan mengidentifikasi Exceptionsubclass 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 printsesuatu, saya pikir mencetak hasil tangkapan Exceptionitu sendiri kemungkinan besar akan melakukan apa yang Anda inginkan, apakah itu memiliki messageatribut 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 denganmessageatribut atau tidak terpisah.