Rumah > Artikel > pembangunan bahagian belakang > Analisis contoh pengendalian pengecualian dalam Python
Dalam python, pengecualian yang dicetuskan oleh ralat adalah seperti berikut
Pengecualian yang berbeza dalam ular sawa boleh dikenal pasti oleh jenis yang berbeza Pengecualian mengenal pasti ralat.
AttributeError Cuba mengakses pokok yang tidak mempunyai objek, seperti foo.x, tetapi foo tidak mempunyai atribut x
Pengecualian input/output IOError pada asasnya tidak boleh membuka fail
ImportError tidak boleh mengimport modul atau pakej pada asasnya masalah laluan atau nama yang salah
Ralat sintaks IndentationError (subkelas); kod tidak diselaraskan dengan betul
IndexError Indeks subskrip melebihi sempadan jujukan, contohnya, apabila x mempunyai tiga elemen sahaja , tetapi cuba mengakses x[5]
KeyError Mencuba mengakses kunci yang tidak wujud dalam kamus
KeyboardInterrupt Ctrl+C telah ditekan
NameError menggunakan pembolehubah yang belum diberikan objek
SyntaxError Kod Python adalah menyalahi undang-undang dan kod tidak boleh disusun ( Saya secara peribadi berpendapat ini adalah ralat sintaks dan telah ditulis secara salah)
TypeError Jenis objek yang masuk tidak memenuhi keperluan
UnboundLocalError cuba untuk akses pembolehubah tempatan yang belum ditetapkan, pada asasnya disebabkan oleh pembolehubah global yang lain dengan nama yang sama, menyebabkan anda berfikir anda sedang mengaksesnya
ValueError Melepasi nilai yang pemanggil tidak menjangka, walaupun nilainya adalah jenis yang betul
# TypeError:int类型不可迭代 for i in 3: pass # ValueError num=input(">>: ") #输入hello int(num) # NameError aaa # IndexError l=['egon','aa'] l[3] # KeyError dic={'name':'egon'} dic['age'] # AttributeError class Foo:pass Foo.x # ZeroDivisionError:无法完成计算 res1=1/0 res2=1+'str'
try: 被检测的代码块 except 异常类型: try中一旦检测到异常,就执行这个位置的逻辑
Contoh
try: f = [ 'a', 'a', 'a','a','a', 'a','a',] g = (line.strip() for line in f) #元组推导式 print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) except StopIteration: f.close()
Kelas pengecualian hanya boleh digunakan untuk mengendalikan pengecualian yang tidak ditentukan tidak boleh dikendalikan.
s1 = 'hello' try: int(s1) except IndexError as e: # 未捕获到异常,程序直接报错 print(e)
s1 = 'hello' try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as e: print(e) except Exception as e: print(e)
Ada satu lagi cubaan/kecuali pernyataan Klausa lain pilihan, jika digunakan, mesti diletakkan selepas semua kecuali klausa.
Klausa else akan dilaksanakan apabila tiada pengecualian berlaku dalam klausa cuba.
for arg in sys.argv[1:]: try: f = open(arg, 'r') except IOError: print('cannot open', arg) else: print(arg, 'has', len(f.readlines()), 'lines') f.close()
Pernyataan cuba-akhir akan melaksanakan kod akhir tanpa mengira sama ada pengecualian berlaku.
Tentukan tingkah laku pembersihan:
s1 = 'hello' try: int(s1) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as e: print(e) #except Exception as e: # print(e) else: print('try内代码块没有异常则执行我') finally: print('无论异常与否,都会执行该模块,通常是进行清理工作')
#tidak sah literal untuk int() dengan asas 10: 'hello'
#Modul ini akan dilaksanakan tanpa mengira pengecualian atau tidak, biasanya Jalankan kerja pembersihan
Python menggunakan pernyataan kenaikan untuk melontarkan pengecualian yang ditentukan. Format sintaks
raise adalah seperti berikut:
raise [Exception [, args [, traceback]]]
try: raise TypeError('抛出异常,类型错误') except Exception as e: print(e)
raise Satu-satunya parameter menentukan pengecualian untuk dilemparkan. Ia mestilah contoh pengecualian atau kelas pengecualian (iaitu, subkelas Pengecualian).
Jika anda hanya ingin tahu sama ada ini memberikan pengecualian dan tidak mahu mengendalikannya, maka kenyataan kenaikan yang mudah boleh menimbulkannya semula.
try: raise NameError('HiThere') except NameError: print('An exception flew by!') raise #An exception flew by! #Traceback (most recent call last): # File "", line 2, in ? #NameError: HiThere
Anda boleh mempunyai pengecualian anda sendiri dengan membuat kelas pengecualian baharu. Kelas pengecualian mewarisi daripada kelas Pengecualian, sama ada secara langsung atau tidak langsung, contohnya:
Dalam contoh ini, lalai __init__() kelas Pengecualian ditindih.
class EgonException(Exception): def __init__(self, msg): self.msg = msg def __str__(self): return self.msg try: raise EgonException('抛出异常,类型错误') except EgonException as e: print(e) #抛出异常,类型错误
Apabila mencipta modul yang mungkin membuang pelbagai pengecualian berbeza, pendekatan biasa ialah mencipta kelas pengecualian asas untuk pakej ini, dan kemudian membina Kelas asas ini cipta subkelas yang berbeza untuk keadaan ralat yang berbeza:
Kebanyakan nama pengecualian berakhir dengan "Ralat", sama seperti penamaan pengecualian standard.
class Error(Exception): """Base class for exceptions in this module.""" pass class InputError(Error): """Exception raised for errors in the input. Attributes: expression -- input expression in which the error occurred message -- explanation of the error """ def __init__(self, expression, message): self.expression = expression self.message = message class TransitionError(Error): """Raised when an operation attempts a state transition that's not allowed. Attributes: previous -- state at beginning of transition next -- attempted new state message -- explanation of why the specific transition is not allowed """ def __init__(self, previous, next, message): self.previous = previous self.next = next self.message = message
assert (assert) digunakan untuk menilai ungkapan dan mencetuskan pengecualian apabila syarat ungkapan itu palsu.
Penegasan boleh terus mengembalikan ralat apabila syarat tidak dipenuhi untuk program berjalan, tanpa perlu menunggu program ranap selepas berjalan.
Format sintaks adalah seperti berikut:
assert expression
bersamaan dengan:
if not expression: raise AssertionError
menegaskan juga boleh diikuti oleh parameter:
assert expression [, arguments]
bersamaan dengan:
if not expression: raise AssertionError(arguments)
Contoh berikut menentukan sama ada sistem semasa adalah Linux Jika syarat tidak dipenuhi, pengecualian akan dicetuskan terus tanpa melaksanakan kod seterusnya:
import sys assert ('linux' in sys.platform), "该代码只能在 Linux 下执行" # 接下来要执行的代码 # Traceback (most recent call last): # File "C:/PycharmProjects/untitled/run.py", line 2, in # assert ('linux' in sys.platform), "该代码只能在 Linux 下执行" # AssertionError: 该代码只能在 Linux 下执行.
Atas ialah kandungan terperinci Analisis contoh pengendalian pengecualian dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!