Tangkapan generik untuk python

89

Saya memiliki beberapa perilaku yang sangat aneh yang tampaknya menghasilkan pengecualian diam-diam. Bagaimana saya bisa menulis try catch umum di mana saya dapat men-debug semua pengecualian. Sesuatu di sepanjang baris:

try:
    # something that fails
except e:
    print e

Sedikit lebih banyak tentang masalah yang dihadapi secara mendetail:

Saya memiliki aplikasi Django yang di komputer saya (Ubuntu Linux 8.10) berfungsi dengan baik melalui runserver dan mod-python. Pada server penyebaran (Ubuntu Linux 8.10) ini bekerja dengan baik melalui runserver, tetapi gagal melalui apache di mod-python.

Saya telah mengurangi penyebabnya menjadi sebagian dari aplikasi yang menggunakan Berkeley DB (bsddb.db), dan kunci sekunder. Metode callback untuk kunci sekunder menggunakan pickle untuk memformat kunci. Gagal ketika saya memanggil acar pada satu nilai. Namun, itu hanya gagal ketika saya menggunakan cPickle, dan menggunakan acar pada nilai yang sama di luar fungsi callback juga berfungsi.

Saya hanya ingin tahu mengapa gagal dengan cPickle.

Staale
sumber

Jawaban:

169

Pengecualian sudah dicetak secara default sebelum program dihentikan. Jika Anda ingin mengirim kesalahan ke tempat lain (bukan mencetaknya), Anda dapat melakukan ini:

try:
    something()
except Exception as e:
    send_somewhere(traceback.format_exception(*sys.exc_info()))
    raise # reraises the exception

perhatikan bahwa format ini menggunakan askata kunci untuk python> 2.6. Cara lama adalah:

except Exception, e:
nosklo.dll
sumber
5
tidak tahu tentang perubahan "Exception as e". "Exception, e" selalu menggangguku, senang melihatnya dibersihkan.
monkut
3
Kata kunci 'as' untuk python> = 2.6
pixelbeat
Solusi yang sangat sederhana. Namun saya google setiap bulan, dan klik pada link atas dan berakhir di sini.
niCk cAMel
3

The modul traceback cukup berguna untuk memformat tracebacks. Anda kemudian dapat menuliskannya ke file log.


sumber
1

Apakah ini berhasil? :

except BaseException, e:
Swaroop CH
sumber
11
Anda tidak boleh menangkap BaseException- itu termasuk SystemExitdan KeyboardInterrupt, hal-hal yang biasanya tidak ingin Anda tangkap.
nosklo