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

<🎜 melebihi maksimum operasi hadZeroDivisionErrorBahagian (atau modulo) sifar (semua jenis data)AssertionError Kenyataan penegasan gagalAttributeErrorObjek tidak mempunyai atribut iniEOFErrorTiada terbina- dalam input, bendera EOF dicapaiEnvironmentErrorKelas asas untuk ralat sistem pengendalianIOError Operasi input/output gagalOSErrorRalat sistem pengendalianWindowsErrorPanggilan Sistem gagalImportErrorGagal mengimport modul/objekLookupErrorKelas asas pertanyaan data tidak sahIndexErrorIndeks tidak ditemui dalam jujukanKeyErrorTidak ditemui dalam peta Ini kunciMemoryErrorRalat limpahan memori (tidak membawa maut kepada penterjemah Python)NameError Objek tidak diisytiharkan/dimulakan (tiada sifat)UnboundLocalErrorMengakses pembolehubah tempatan yang tidak diinisialisasiReferenceErrorRuntimeErrorNotImplementedError<🎜 Kaedah belum dilaksanakanSyntaxErrorRalat sintaks Python Ralat IndentasiRalat Lekukan TabErrorTab dan ruang bercampurSystemErrorRalat sistem penterjemah umumTypeErrorOperasi tidak sah pada jenisValueErrorParameter tidak sah<🎜 🎜>UnicodeErrorUnicode related errorUnicodeDecodeErrorUnicode decoding ErrorUnicodeError Ralat pengekodan UnikodRalat penukaran UnikodKelas asas untuk amaranAmaran tentang ciri yang tidak digunakanAmaran bahawa semantik binaan akan berubah pada masa hadapanLama tentang Amaran automatik untuk kenaikan pangkat yang lamaAmaran bahawa ciri itu akan ditamatkan<🎜
Nama pengecualianPenerangan


BaseExceptionKelas asas untuk semua pengecualian
SystemExitPermintaan jurubahasa untuk keluar
KeyboardInterruptPengguna mengganggu pelaksanaan (biasanya menaip ^C)
Exception Kelas asas untuk ralat umum
StopIterationIterator tidak mempunyai nilai lagi
GeneratorExitGenerator Pengecualian berlaku untuk memberitahu keluar
StandardErrorKelas asas untuk semua pengecualian standard terbina dalam
ArithmeticErrorKelas asas untuk semua ralat pengiraan berangka
FloatingPointErrorRalat pengiraan titik terapung
OverflowError
<🎜 Percubaan rujukan lemah untuk mengakses objek yang telah dikumpul sampah
Ralat masa jalan umum
UnicodeTranslateError
Amaran
Amaran Penamatan
Amaran Masa Depan
Amaran Limpahan
Amaran Penamatan Belum Selesai
RtimeWarningAmaran tentang tingkah laku masa jalan yang mencurigakan
SyntaxWarningAmaran tentang sintaks yang mencurigakan
Amaran PenggunaAmaran 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