Saya memiliki try
blok ini dalam kode saya:
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise ValueError(errmsg)
Sebenarnya, saya sebenarnya mengangkat yang lain ValueError
, bukan yang ValueError
dilemparkan oleh do_something...()
, yang disebut err
dalam kasus ini. Bagaimana cara melampirkan pesan khusus err
? Saya mencoba kode berikut tetapi gagal karena err
, ValueError
misalnya , tidak dapat dipanggil:
try:
do_something_that_might_raise_an_exception()
except ValueError as err:
errmsg = 'My custom error message.'
raise err(errmsg)
Jawaban:
Pembaruan: Untuk Python 3, periksa jawaban Ben
Untuk melampirkan pesan ke pengecualian saat ini dan menaikkannya kembali: (coba luar / hanya untuk menunjukkan efeknya)
Untuk python 2.x di mana x> = 6:
Ini juga akan melakukan hal yang benar jika
err
yang berasal dariValueError
. Sebagai contohUnicodeDecodeError
.Perhatikan bahwa Anda dapat menambahkan apa pun yang Anda suka
err
. Sebagai contoherr.problematic_array=[1,2,3]
.Sunting: @Ducan menunjuk dalam komentar di atas tidak bekerja dengan python 3 karena
.message
bukan anggotaValueError
. Alih-alih, Anda dapat menggunakan ini (valid python 2.6 atau lebih baru atau 3.x):Sunting2:
Bergantung pada apa tujuannya, Anda juga dapat memilih untuk menambahkan informasi tambahan di bawah nama variabel Anda sendiri. Untuk python2 dan python3:
sumber
print
, Anda mungkin harus mencatat bahwa kode Anda tidak berfungsi di Python 3.x karena tidak adamessage
atribut pada pengecualian.err.args = (err.args[0] + " hello",) + err.args[1:]
dapat bekerja lebih andal (dan kemudian hanya mengonversi ke string untuk mendapatkan pesan)..message
atribut melakukan apa pun di sini adalah karena atribut ini dicetak secara eksplisit . Jika Anda menaikkan pengecualian tanpa menangkap dan mencetak, Anda tidak akan melihat.message
atribut melakukan sesuatu yang bermanfaat.Jika Anda cukup beruntung hanya mendukung python 3.x, ini benar-benar menjadi hal yang indah :)
bangkit dari
Kami dapat memadukan pengecualian menggunakan kenaikan gaji dari .
Dalam hal ini, pengecualian yang akan ditangkap oleh penelepon Anda memiliki nomor baris tempat kami menaikkan pengecualian kami.
Perhatikan pengecualian bawah hanya memiliki stacktrace dari tempat kami mengangkat pengecualian kami. Penelepon Anda masih bisa mendapatkan pengecualian asli dengan mengakses
__cause__
atribut pengecualian yang mereka tangkap.with_traceback
Atau Anda bisa menggunakan with_traceback .
Menggunakan formulir ini, pengecualian penelepon Anda akan menangkap memiliki traceback dari tempat kesalahan asli terjadi.
Perhatikan bahwa pengecualian bawah memiliki garis tempat kami melakukan pembagian yang tidak valid serta garis tempat kami mengeluarkan pengecualian.
sumber
raise Exception('Smelly socks') from e
dimodifikasi untuk hanya menambahkan "Smelly socks" sebagai komentar pada traceback asli daripada memperkenalkan traceback baru sendiri.raise RuntimeError("Something bad happened") from None
cetakan:
sumber
raise
tanpa parameter naik kembali. Jika OP ingin menambahkan pesan, ia harus mengajukan pengecualian baru dan dapat menggunakan kembali pesan / jenis pengecualian asli.Tampaknya semua jawaban menambahkan info ke e.args [0], sehingga mengubah pesan kesalahan yang ada. Apakah ada kerugian untuk memperpanjang tuple args saja? Saya pikir kemungkinan terbalik adalah, Anda dapat meninggalkan pesan kesalahan asli sendirian untuk kasus-kasus di mana parsing string itu diperlukan; dan Anda bisa menambahkan beberapa elemen ke tuple jika penanganan kesalahan khusus Anda menghasilkan beberapa pesan atau kode kesalahan, untuk kasus-kasus di mana traceback akan diuraikan secara program (seperti melalui alat pemantauan sistem).
atau
Bisakah Anda melihat kelemahan dari pendekatan ini?
sumber
Templat kode ini harus memungkinkan Anda untuk meningkatkan pengecualian dengan pesan khusus.
sumber
Entah menaikkan pengecualian baru dengan menggunakan pesan kesalahan Anda
atau
di tempat Anda ingin menaikkannya ATAU melampirkan (mengganti) pesan kesalahan ke dalam pengecualian saat ini menggunakan 'from' (hanya didukung oleh Python 3.x):
sumber
Ini adalah fungsi yang saya gunakan untuk mengubah pesan pengecualian di Python 2.7 dan 3.x sambil mempertahankan traceback asli. Itu membutuhkan
six
sumber
Pengecualian bawaan Python 3 memiliki
strerror
bidang:sumber
Jawaban saat ini tidak berfungsi dengan baik untuk saya, jika pengecualian tidak ditangkap kembali pesan terlampir tidak ditampilkan.
Tetapi melakukan seperti di bawah keduanya menyimpan jejak dan menunjukkan pesan yang ditambahkan terlepas dari apakah pengecualian ditangkap kembali atau tidak.
(Saya menggunakan Python 2.7, belum mencobanya dengan Python 3)
sumber
Tidak satu pun dari solusi di atas melakukan apa yang saya inginkan, yaitu menambahkan beberapa informasi ke bagian pertama dari pesan kesalahan yaitu saya ingin pengguna saya melihat pesan khusus saya terlebih dahulu.
Ini bekerja untuk saya:
sumber
Ini hanya berfungsi dengan Python 3 . Anda dapat mengubah argumen asli pengecualian dan menambahkan argumen Anda sendiri.
Pengecualian mengingat argumen yang dibuat dengannya. Saya kira ini adalah agar Anda dapat memodifikasi pengecualian.
Dalam fungsi ini,
reraise
kami menambahkan argumen asli pengecualian dengan argumen baru apa pun yang kami inginkan (seperti pesan). Akhirnya kami kembali meningkatkan pengecualian sambil mempertahankan jejak-kembali sejarah.keluaran
sumber
Jika Anda ingin menyesuaikan jenis kesalahan, hal sederhana yang dapat Anda lakukan adalah mendefinisikan kelas kesalahan berdasarkan ValueError.
sumber