Pengendalian pengecualian Python
Python menyediakan dua fungsi yang sangat penting untuk mengendalikan pengecualian dan ralat yang berlaku apabila program python sedang dijalankan. Anda boleh menggunakan ciri ini untuk menyahpepijat program python.
Pengendalian pengecualian: Tutorial Python tapak ini akan memperkenalkannya secara terperinci.
Pernyataan: Tutorial Python tapak ini akan memperkenalkannya secara terperinci.
Pengecualian standard Python
Nama pengecualian | Penerangan |
---|---|
BaseException | Kelas asas untuk semua pengecualian |
SystemExit | Permintaan jurubahasa untuk keluar |
KeyboardInterrupt | Pengguna mengganggu pelaksanaan (biasanya menaip ^C) |
Exception | Kelas asas untuk ralat umum |
StopIteration | Iterator tidak mempunyai nilai lagi |
GeneratorExit | Generator Pengecualian berlaku untuk memberitahu keluar |
StandardError | Kelas asas untuk semua pengecualian standard terbina dalam |
ArithmeticError | Kelas asas untuk semua ralat pengiraan berangka |
FloatingPointError | Ralat pengiraan titik terapung |
OverflowError | <🎜 melebihi maksimum operasi had|
Bahagian (atau modulo) sifar (semua jenis data) | |
Kenyataan penegasan gagal | |
Objek tidak mempunyai atribut ini | |
Tiada terbina- dalam input, bendera EOF dicapai | |
Kelas asas untuk ralat sistem pengendalian | |
Operasi input/output gagal | |
Ralat sistem pengendalian | |
Panggilan Sistem gagal | |
Gagal mengimport modul/objek | |
Kelas asas pertanyaan data tidak sah | |
Indeks tidak ditemui dalam jujukan | |
Tidak ditemui dalam peta Ini kunci | |
Ralat limpahan memori (tidak membawa maut kepada penterjemah Python) | |
Objek tidak diisytiharkan/dimulakan (tiada sifat) | |
Mengakses pembolehubah tempatan yang tidak diinisialisasi | |
<🎜 Percubaan rujukan lemah untuk mengakses objek yang telah dikumpul sampah | |
Ralat masa jalan umum | |
SyntaxError | |
Ralat Indentasi | |
TabError | |
SystemError | |
TypeError | |
ValueError | |
<🎜 🎜>UnicodeError | |
UnicodeDecodeError | |
UnicodeError | |
UnicodeTranslateError | |
Amaran | |
Amaran Penamatan | |
Amaran Masa Depan | |
Amaran Limpahan | |
Amaran Penamatan Belum Selesai | |
RtimeWarning | Amaran tentang tingkah laku masa jalan yang mencurigakan |
SyntaxWarning | Amaran tentang sintaks yang mencurigakan |
Amaran Pengguna | Amaran yang dihasilkan oleh kod pengguna |
Apakah pengecualian?
Pengecualian ialah peristiwa yang berlaku semasa pelaksanaan program dan menjejaskan pelaksanaan biasa program.
Secara amnya, pengecualian berlaku apabila Python tidak dapat mengendalikan program secara normal.
Pengecualian ialah objek Python yang mewakili ralat.
Apabila pengecualian berlaku dalam skrip Python, kita perlu menangkap dan mengendalikannya, jika tidak, program akan menamatkan pelaksanaan.
Pengendalian pengecualian
Untuk menangkap pengecualian, pernyataan cuba/kecuali boleh digunakan.
Pernyataan cuba/kecuali digunakan untuk mengesan ralat dalam blok pernyataan cuba, supaya pernyataan kecuali boleh menangkap maklumat pengecualian dan mengendalikannya.
Jika anda tidak mahu menamatkan program anda apabila pengecualian berlaku, cuba sahaja.
Sintaks:
Berikut ialah sintaks cuba....kecuali...lain: Prinsip kerja
try: <语句> #运行别的代码 except <名字>: <语句> #如果在try部份引发了'name'异常 except <名字>,<数据>: <语句> #如果引发了'name'异常,获得附加的数据 else: <语句> #如果没有异常发生
cuba ialah, Apabila pernyataan cuba dimulakan, Python menandakan konteks program semasa supaya ia boleh dikembalikan di sini apabila pengecualian berlaku terlebih dahulu, dan apa yang berlaku seterusnya bergantung pada sama ada pengecualian berlaku semasa pelaksanaan.
Jika pengecualian berlaku apabila pernyataan selepas percubaan dilaksanakan, python akan melompat kembali untuk mencuba dan melaksanakan klausa pertama kecuali yang sepadan dengan pengecualian Selepas pengecualian dikendalikan, aliran kawalan lulus Kenyataan percubaan keseluruhan (melainkan pengecualian baharu dilemparkan semasa mengendalikan pengecualian).
Jika pengecualian berlaku dalam pernyataan selepas percubaan, tetapi tiada padanan kecuali klausa, pengecualian akan diserahkan kepada percubaan atas atau ke peringkat atas program (ini akan menamatkan program dan mencetak mesej ralat lalai).
Jika tiada pengecualian berlaku apabila klausa try dilaksanakan, python akan melaksanakan pernyataan selepas pernyataan else (jika ada yang lain), dan kemudian aliran kawalan melalui keseluruhan percubaan kenyataan.
Contoh
Berikut ialah contoh mudah, ia membuka fail, menulis kandungan dalam fail dan tiada pengecualian berlaku:
#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") except IOError: print "Error: 没有找到文件或读取文件失败" else: print "内容写入文件成功" fh.close()
Hasil keluaran program di atas:
$ python test.py 内容写入文件成功 $ cat testfile # 查看写入的内容 这是一个测试文件,用于测试异常!!
Contoh
Berikut ialah contoh mudah, ia membuka fail dan menulis kandungan dalam fail, tetapi fail itu tidak mempunyai kebenaran menulis, Pengecualian berlaku:
#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") except IOError: print "Error: 没有找到文件或读取文件失败" else: print "内容写入文件成功" fh.close()
Untuk kemudahan ujian sebelum melaksanakan kod, kita boleh mengalih keluar kebenaran tulis fail testfile Perintahnya adalah seperti berikut:
chmod -w testfile
Kemudian jalankan kod di atas:
$ python test.py Error: 没有找到文件或读取文件失败
Gunakan kecuali tanpa sebarang jenis pengecualian
Anda boleh menggunakan kecuali tanpa sebarang jenis pengecualian, seperti yang ditunjukkan dalam contoh berikut:
try: 正常的操作 ...................... except: 发生异常,执行这块代码 ...................... else: 如果没有异常执行这块代码
Di atas Pernyataan cara try-except menangkap semua pengecualian kejadian. Tetapi ini bukan cara yang baik, kami tidak dapat mengenal pasti maklumat abnormal tertentu melalui program ini. Kerana ia menangkap semua pengecualian.
Gunakan kecuali dengan berbilang jenis pengecualian
Anda juga boleh menggunakan pernyataan kecuali yang sama untuk mengendalikan berbilang mesej pengecualian, seperti yang ditunjukkan di bawah:
try: 正常的操作 ...................... except(Exception1[, Exception2[,...ExceptionN]]]): 发生以上多个异常中的一个,执行这块代码 ...................... else: 如果没有异常执行这块代码
pernyataan cuba-akhir
pernyataan cuba-akhir akan melaksanakan kod terakhir tanpa mengira sama ada pengecualian berlaku.
try: <语句> finally: <语句> #退出try时总会执行 raise
Contoh
#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") finally: print "Error: 没有找到文件或读取文件失败"
Jika fail yang dibuka tidak mempunyai kebenaran boleh tulis, outputnya adalah seperti berikut:
$ python test.py Error: 没有找到文件或读取文件失败
Contoh yang sama juga boleh ditulis seperti berikut:
#!/usr/bin/python # -*- coding: UTF-8 -*- try: fh = open("testfile", "w") try: fh.write("这是一个测试文件,用于测试异常!!") finally: print "关闭文件" fh.close() except IOError: print "Error: 没有找到文件或读取文件失败"
Apabila pengecualian dilemparkan dalam blok cuba, kod blok akhirnya dilaksanakan serta-merta.
Selepas semua pernyataan dalam blok akhirnya dilaksanakan, pengecualian dicetuskan semula dan kod blok kecuali dilaksanakan.
Kandungan parameter adalah berbeza daripada pengecualian.
Parameter pengecualian
Pengecualian boleh membawa parameter, yang boleh digunakan sebagai parameter maklumat pengecualian output.
Anda boleh menangkap parameter pengecualian melalui pernyataan kecuali, seperti yang ditunjukkan di bawah:
try: 正常的操作 ...................... except ExceptionType, Argument: 你可以在这输出 Argument 的值...
Nilai pengecualian yang diterima oleh pembolehubah biasanya disertakan dalam pernyataan pengecualian. Pembolehubah dalam bentuk tupel boleh menerima satu atau lebih nilai.
tuple biasanya mengandungi rentetan yang salah, nombor yang salah, kedudukan yang salah.
Instance
Berikut ialah contoh pengecualian tunggal:
#!/usr/bin/python # -*- coding: UTF-8 -*- # 定义函数 def temp_convert(var): try: return int(var) except ValueError, Argument: print "参数没有包含数字\n", Argument # 调用函数 temp_convert("xyz");
Hasil pelaksanaan program di atas adalah seperti berikut:
$ python test.py 参数没有包含数字 invalid literal for int() with base 10: 'xyz'
Pengecualian pencetus
Kita boleh menggunakan pernyataan raise untuk mencetuskan pengecualian sendiri
Format sintaks kenaikan adalah seperti berikut:
raise [Exception [, args [, traceback]]]
Pengecualian dalam pernyataan ialah jenis pengecualian (contohnya, NameError) dan parameter ialah nilai parameter pengecualian. Parameter ini adalah pilihan, jika tidak disediakan, parameter pengecualian ialah "Tiada".
Parameter terakhir adalah pilihan (jarang digunakan dalam amalan) dan, jika ada, ialah objek pengecualian surih.
Instance
Pengecualian boleh menjadi rentetan, kelas atau objek. Kebanyakan pengecualian yang disediakan oleh kernel Python adalah kelas instantiated, yang merupakan parameter contoh kelas.
Mentakrifkan pengecualian adalah sangat mudah, seperti berikut:
def functionName( level ): if level < 1: raise Exception("Invalid level!", level) # 触发异常后,后面的代码就不会再执行
Nota: Untuk dapat menangkap pengecualian, pernyataan "kecuali" mesti membuang objek kelas dengan pengecualian atau rentetan yang sama.
Sebagai contoh, jika kita menangkap pengecualian di atas, pernyataan "kecuali" adalah seperti berikut:
try: 正常逻辑 except "Invalid level!": 触发自定义异常 else: 其余代码
Instance
#!/usr/bin/python # -*- coding: UTF-8 -*- # 定义函数 def mye( level ): if level < 1: raise Exception("Invalid level!", level) # 触发异常后,后面的代码就不会再执行 try: mye(0) // 触发异常 except "Invalid level!": print 1 else: print 2
Laksanakan kod di atas, hasil output ialah:
$ python test.py Traceback (most recent call last): File "test.py", line 11, in <module> mye(0) File "test.py", line 7, in mye raise Exception("Invalid level!", level) Exception: ('Invalid level!', 0)
Pengecualian Ditentukan Pengguna
Program boleh menamakan pengecualian mereka sendiri dengan mencipta kelas pengecualian baharu. Pengecualian biasanya harus diwarisi daripada kelas Pengecualian, sama ada secara langsung atau tidak langsung.
Berikut ialah contoh yang berkaitan dengan RuntimeError Kelas dibuat dalam contoh itu ialah RuntimeError, yang digunakan untuk mengeluarkan lebih banyak maklumat apabila pengecualian dicetuskan.
Dalam blok pernyataan cuba, pernyataan blok kecuali dilaksanakan selepas pengecualian yang ditentukan pengguna Pembolehubah e digunakan untuk mencipta contoh kelas Networkerror.
class Networkerror(RuntimeError): def __init__(self, arg): self.args = arg
Selepas anda mentakrifkan kelas di atas, anda boleh mencetuskan pengecualian seperti berikut:
try: raise Networkerror("Bad hostname") except Networkerror,e: print e.args