Bagaimana saya bisa menulis blok try
/ except
yang menangkap semua pengecualian?
sys.stderr
dan mungkin dicatat. Itu adalah pengecualian yang benar-benar valid dan umum.
try: whatever() except Exception as e: exp_capture()
:?
Bagaimana saya bisa menulis blok try
/ except
yang menangkap semua pengecualian?
sys.stderr
dan mungkin dicatat. Itu adalah pengecualian yang benar-benar valid dan umum.
try: whatever() except Exception as e: exp_capture()
:?
Jawaban:
Anda bisa tetapi Anda mungkin tidak boleh:
try:
do_something()
except:
print "Caught it!"
Namun, ini juga akan menangkap pengecualian seperti KeyboardInterrupt
dan Anda biasanya tidak menginginkannya, bukan? Kecuali jika Anda langsung meningkatkan pengecualian - lihat contoh berikut dari dokumen :
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
except Exception:
telanjang kecuali yang Anda miliki di sana juga akan menangkap yang BaseException.
Terlepas dari except:
klausa telanjang (yang seperti yang orang lain katakan tidak boleh Anda gunakan), Anda bisa menangkap Exception
:
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
Anda biasanya hanya akan mempertimbangkan melakukan ini pada tingkat terluar kode Anda jika misalnya Anda ingin menangani pengecualian yang tidak tertangkap sebelum dihentikan.
Keuntungan except Exception
lebih dari telanjang except
adalah bahwa ada beberapa pengecualian yang tidak akan ditangkap, paling jelas KeyboardInterrupt
dan SystemExit
: jika Anda menangkap dan menelannya maka Anda bisa menyulitkan siapa pun untuk keluar dari skrip Anda.
Exception
. Perhatikan bahwa tidak mungkin untuk menaikkan int
pengecualian, dan mencoba melakukannya menimbulkan TypeError
pengecualian, yang akan ditangkap oleh except Exception
klausa terlampir dalam kasus seperti itu. Di sisi lain, kelas gaya lama dapat dinaikkan dan dikualifikasikan sebagai "non-pengecualian" yang tidak subkelas Exception
- ini akan ditangkap oleh except
klausa telanjang tetapi tidak oleh except Exception
klausa.
TypeError
sys.exit()
biasanya berarti Anda mengharapkan aplikasi untuk berhenti tetapi jika Anda menangkap SystemExit tidak akan. Demikian juga jika Anda menekan control-C pada skrip yang sedang berjalan (Ctrl-break pada windows) Anda mengharapkan program untuk berhenti, tidak untuk menangkap kesalahan dan terus berjalan. Tetapi Anda dapat menangkap salah satu dari keduanya jika ingin melakukan pembersihan sebelum ada.
Anda dapat melakukan ini untuk menangani pengecualian umum
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
Untuk menangkap semua pengecualian yang mungkin, tangkap BaseException
. Itu di atas hierarki Pengecualian:
Python 3: https://docs.python.org/3.5/library/exceptions.html#exception-hierarchy
Python 2.7: https://docs.python.org/2.7/library/exceptions.html#exception-hierarchy
try:
something()
except BaseException as error:
print('An exception occurred: {}'.format(error))
Tetapi seperti yang disebutkan orang lain, Anda biasanya tidak memerlukan ini, hanya untuk kasus tertentu.
Contoh yang sangat sederhana, mirip dengan yang ditemukan di sini:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
Jika Anda mencoba untuk menangkap SEMUA pengecualian, maka letakkan semua kode Anda dalam pernyataan "coba:", sebagai ganti 'cetak "Melakukan tindakan yang dapat menimbulkan pengecualian."'.
try:
print "Performing an action which may throw an exception."
except Exception, error:
print "An exception was thrown!"
print str(error)
else:
print "Everything looks great!"
finally:
print "Finally is called directly after executing the try statement whether an exception is thrown or not."
Dalam contoh di atas, Anda akan melihat output dalam urutan ini:
1) Melakukan tindakan yang dapat menimbulkan pengecualian.
2) Akhirnya dipanggil langsung setelah menjalankan pernyataan coba apakah pengecualian dilemparkan atau tidak.
3) "Sebuah pengecualian dilemparkan!" atau "Semuanya tampak hebat!" tergantung pada apakah pengecualian dilemparkan.
Semoga ini membantu!
Ada beberapa cara untuk melakukan ini khususnya dengan Python 3.0 dan di atasnya
Pendekatan 1
Ini adalah pendekatan sederhana tetapi tidak direkomendasikan karena Anda tidak akan tahu persis baris kode mana yang benar-benar melempar pengecualian:
def bad_method():
try:
sqrt = 0**-1
except Exception as e:
print(e)
bad_method()
Pendekatan 2
Pendekatan ini direkomendasikan karena memberikan lebih banyak detail tentang setiap pengecualian. Itu termasuk:
Satu-satunya kelemahan adalah tracback perlu diimpor.
import traceback
def bad_method():
try:
sqrt = 0**-1
except Exception:
print(traceback.print_exc())
bad_method()
Saya baru saja menemukan trik kecil ini untuk menguji apakah nama pengecualian di Python 2.7. Terkadang saya telah menangani pengecualian khusus dalam kode, jadi saya perlu tes untuk melihat apakah nama itu ada dalam daftar pengecualian yang ditangani.
try:
raise IndexError #as test error
except Exception as e:
excepName = type(e).__name__ # returns the name of the exception
try:
whatever()
except:
# this will catch any exception or error
Perlu disebutkan ini bukan pengkodean Python yang tepat. Ini juga akan menangkap banyak kesalahan yang mungkin tidak ingin Anda tangkap.