Saya mendapatkan peringatan bahwa BaseException.message sudah usang dalam Python 2.6 ketika saya menggunakan pengecualian yang ditentukan pengguna berikut:
class MyException(Exception):
def __init__(self, message):
self.message = message
def __str__(self):
return repr(self.message)
Ini peringatannya:
DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
self.message = message
Ada apa dengan ini? Apa yang harus saya ubah untuk menyingkirkan peringatan penghinaan?
python
exception
deprecated
sunyi sepi
sumber
sumber
Jawaban:
Solusi - hampir tidak diperlukan pengkodean
Cukup mewarisi kelas pengecualian Anda dari
Exception
dan meneruskan pesan sebagai parameter pertama ke konstruktorContoh:
Anda dapat menggunakan
str(my)
atau (kurang elegan)my.args[0]
untuk mengakses pesan khusus.Latar Belakang
Dalam versi Python yang lebih baru (dari 2.6) kita seharusnya mewarisi kelas pengecualian khusus kami dari Exception yang ( mulai dari Python 2.5 ) mewarisi dari BaseException. Latar belakang dijelaskan secara rinci dalam PEP 352 .
__str__
dan__repr__
sudah diimplementasikan dengan cara yang bermakna, terutama untuk kasus hanya satu arg (yang dapat digunakan sebagai pesan).Anda tidak perlu mengulang
__str__
atau__init__
mengimplementasikan atau membuat_get_message
seperti yang disarankan oleh orang lain.sumber
str
jeda jika pengecualian dibangun dengan argumen unicode:str(MyException(u'\xe5'))
raisesUnicodeEncodeError
. Menggunakanunicode
bukannyastr
tidak mudah karenaunicode(MyException('\xe5'))
meningkatkan UnicodeDecodeError. Apakah ini berarti bahwa jika saya tidak tahu sebelumnya apakah argumennya adalahstr
atauunicode
, saya harus menggunakan.args[0]
tempat yang sebelumnya saya gunakan.message
?.message
dalam proyek kami dengan.args[0]
, dan itu tidak menyebabkan masalah bagi kami.Ya, itu sudah tidak digunakan lagi di Python 2.6 karena akan hilang di Python 3.0
Kelas BaseException tidak menyediakan cara untuk menyimpan pesan kesalahan lagi. Anda harus menerapkannya sendiri. Anda dapat melakukan ini dengan subkelas yang menggunakan properti untuk menyimpan pesan.
Semoga ini membantu
sumber
@property
sintaks ketika Anda benar-benar membutuhkan enkapsulasi.@property
untuk menonaktifkan peringatan penghentian.Ini adalah kelas Anda dengan gaya Python2.6. Pengecualian baru mengambil sejumlah argumen sewenang-wenang.
sumber
Cara meniru peringatan
Biarkan saya mengklarifikasi masalah, karena seseorang tidak dapat mereplikasi ini dengan kode sampel pertanyaan, ini akan mereplikasi peringatan dalam Python 2.6 dan 2.7, jika Anda memiliki peringatan yang diaktifkan (melalui
-W
bendera ,PYTHONWARNINGS
variabel lingkungan, atau modul peringatan ):Berhenti menggunakan
.message
Saya lebih suka
repr(error)
, yang mengembalikan string yang berisi nama jenis kesalahan, repr dari pesan, jika ada, dan repr dari argumen yang tersisa.Menghilangkan peringatan saat masih menggunakan
.message
Dan cara Anda mendapatkan menyingkirkan dari
DeprecationWarning
adalah subclass pengecualian builtin sebagai desainer Python dimaksudkan:hanya mendapatkan
.message
atribut tanpaerror.message
Jika Anda tahu ada satu argumen, sebuah pesan, untuk Pengecualian dan itulah yang Anda inginkan, lebih baik untuk menghindari atribut pesan dan hanya mengambil
str
kesalahan. Katakan untuk subclassException
:Dan penggunaan:
Lihat juga jawaban ini:
Cara yang tepat untuk mendeklarasikan pengecualian khusus dalam Python modern?
sumber
Sejauh yang saya tahu, cukup menggunakan nama yang berbeda untuk atribut pesan menghindari konflik dengan kelas dasar, dan dengan demikian menghentikan peringatan penghentian:
Sepertinya hack bagi saya.
Mungkin seseorang dapat menjelaskan mengapa peringatan itu dikeluarkan bahkan ketika subclass mendefinisikan atribut pesan secara eksplisit. Jika kelas dasar tidak lagi memiliki atribut ini, seharusnya tidak ada masalah.
sumber
Melanjutkan dari jawaban geekQ , penggantian kode yang disukai tergantung pada apa yang perlu Anda lakukan:
Terkadang pengecualian memiliki lebih dari satu argumen, jadi
my.args[0]
tidak dijamin untuk memberikan semua informasi yang relevan.Misalnya:
Mencetak sebagai output:
Namun itu merupakan trade off yang sensitif terhadap konteks, karena misalnya:
sumber
str(my)
sebagai gantimy.message
.Saran untuk menggunakan str (myexception) mengarah ke masalah unicode di python 2.7, misalnya:
:(
berfungsi seperti yang diharapkan, dan lebih disukai dalam kasus di mana beberapa konten dari string kesalahan termasuk input pengguna
sumber
Posting pzrq mengatakan untuk menggunakan:
Inilah yang saya butuhkan.
(Jika Anda berada di lingkungan unicode, tampaknya:
akan bekerja, dan tampaknya berfungsi dengan baik di lingkungan non-unicode)
Pzrq mengatakan banyak hal bagus lainnya, tetapi saya hampir melewatkan jawaban mereka karena semua hal baik itu. Karena saya tidak memiliki 50 poin, saya tidak dapat mengomentari jawaban mereka untuk mencoba menarik perhatian pada solusi sederhana yang berhasil, dan karena saya tidak memiliki 15 poin, saya tidak dapat memilih jawaban itu, tetapi saya dapat memposting (merasa terbelakang, tetapi oh well) - jadi di sini saya memposting - mungkin kehilangan poin untuk itu ...
Karena poin saya adalah untuk menarik perhatian pada jawaban pzrq, tolong jangan sayu dan lewatkan semuanya di bawah. beberapa baris pertama dari posting ini adalah yang paling penting.
Ceritaku:
Masalah yang saya datangi di sini adalah jika Anda ingin menangkap pengecualian dari kelas yang tidak dapat Anda kendalikan - lalu bagaimana ??? Saya tentu saja tidak akan mensubklasifikasikan semua kelas yang mungkin digunakan kode saya dalam upaya untuk bisa mendapatkan pesan dari semua kemungkinan pengecualian!
Saya menggunakan:
yang, seperti kita semua tahu, memberi peringatan yang ditanyakan OP (yang membawaku ke sini), dan ini, yang diberikan pzrq sebagai cara untuk melakukannya:
tidak.
Saya tidak berada dalam lingkungan unicode, tetapi jawaban jjc membuat saya bertanya-tanya, jadi saya harus mencobanya. Dalam konteks ini menjadi:
yang mengejutkan saya, bekerja persis seperti str (e) - jadi sekarang itulah yang saya gunakan.
Tidak tahu apakah 'str (e) / unicode (e)' adalah 'cara Python yang disetujui', dan saya mungkin akan mencari tahu mengapa itu tidak baik ketika saya sampai ke 3.0, tetapi orang berharap bahwa kemampuan untuk menangani suatu pengecualian tak terduga (*) tanpa sekarat dan masih mendapatkan beberapa informasi darinya tidak akan pernah hilang ...
(*) Hmm. "pengecualian tak terduga" - Saya pikir saya baru saja gagap!
sumber