Kuidas toimida eranditega Pythonis

Kuidas toimida eranditega Pythonis

Erandite käsitlemine on teie võimalus kohandada ja kuvada veateateid oma programmi osade jaoks, mis ei tööta.





Olenemata sellest, kas loote veebisaiti, valmistate API -d, moodulit või mõnda muud toodet, kasutades Pythoni, saate eranditega tõhusalt toime tulla ja saate vea põhjuse selgesõnaliselt välja tuua.





Siin vaatame, kuidas saate Pythoni eranditega hakkama saada.





Kuidas erandite käsitlemine Pythonis toimib?

Kui tõstate erandeid, ütlete Pythonile, et ta avab teate, kui koodiplokk ebaõnnestub. Erandite käsitlemine on nagu kellelegi käsklus raskust tõsta. Ja kui nad ei saa, peaksid nad sellest teile teada andma.

Erandi tõstmiseks Pythonis käskite Pythonil siiski proovida teatud koodiplokki käivitada. Kui see blokeerimine ebaõnnestub, võite paluda Pythonil tõsta ebaõnnestunud koodile määratud erandi.



Millal peaksite Pythoni programmeerimisel erandeid kasutama?

Enamikul juhtudel saate erandeid kasutades varjata standardseid Pythoni vigu. Kuid peate olema valvas, kuna see võib põhjustada silumisprobleeme. Järelikult võib teil olla raske välja selgitada võimaliku vea algpõhjust.

Seetõttu peaksite kasutama erandeid, kui olete oma koodi piisavalt testinud ja olete kindel, et see töötab. Lõppkokkuvõttes on hea tava kasutada neid võimalike vigade käsitlemiseks, mis võivad tuleneda kasutaja otsast, mitte koodist endast.





Teisisõnu, saate kasutada erandeid hoiatusvahendina, et juhendada kasutajaid oma programmi kasutama.

Pythoni erandite käsitlemine

Erandite käsitlemiseks Pythonis peate esmalt oma koodi a -sse mähkima proovi ... v.a blokeerida. Aeg -ajalt peate võib -olla lisama a lõpuks avaldus edasiste toimingute tegemiseks, sõltuvalt teie vajadustest.





Pythoni erandite kodeerimiskontseptsioon näeb tavaliselt välja selline:

try:
'code to be executed'
except:
'error message'

Nagu varem mainitud, saate ka kasutada lõpuks erandplokis. Kuid kood, mille kirjutate a sisse lõpuks klausel on sõltumatu ja töötab sõltumata sellest, kas on erand või mitte.

Sisuliselt on see kasulik, kui teil on veel üks koodiplokk, mida soovite pidevalt käivitada, olenemata sellest, mis selles toimub proovi ... v.a blokeerida.

Siin on näide:

try:
print(9+6)
except:
print('error message')
finally:
print('please restart')
Output:
15
please restart

Ülaltoodud koodis palun taaskäivitage töötab pidevalt, olenemata sellest, kas on erand või mitte.

An muidu seisund võib järgneda ka välja arvatud avaldus:

try:
C = 2 + B
except:
print('B needs to be defined')
else:
print(u'Added successfully! The result is %s'%(C))
Output: B needs to be defined

Nüüd proovige seda uuesti, määrates 'B':

try:
B = 5
C = 2 + B
except:
print('B needs to be defined')
else:
print(u'Added successfully! The result is %s'%(C))
Output: Added successfully! The result is 7

Ülaltoodud näited on mittestandardsed erandid. Kuid teil võib olla selgem erand, kui ühendate sisseehitatud (määratletud) erandid mittestandardsete eranditega:

try:
C = 2 + B
except NameError as err:
print(err, ':', 'B needs to be defined, please')
else:
print(u'Added successfully! The result is %s'%(C))
Output: name 'B' is not defined : B needs to be defined, please

Ülaltoodud erand kontrollib kõigepealt, kas on olemas NimiViga aastal proovige blokeerida. Seejärel prindib see standardi NimiViga erand kõigepealt ('nimi' B 'pole määratletud'). Ja toetab seda teie kirjaliku erandiga ('B tuleb määratleda, palun').

Seotud: Programmeerimise põhiprintsiibid, mida iga programmeerija peab teadma

kus on MacBook Pro mikrofon

Ja kui soovite tegeleda erandite ahelaga, võite kaasas olla ka a proovige blokeerida paljudega välja arvatud avaldused. See on üsna mugav, kui teie proovige plokil võib olla palju erandeid:

try:
B = 5
C = 2 + B
D = float(6)
F = 7/0
except NameError as err:
print(err,':', 'B needs to be defined, please')
except ValueError as val:
print(val,':', 'You can't convert that data')
except ZeroDivisionError as zeroerr:
print(zeroerr,':', 'You can't divide a number by zero')
else:
print(u'Operation successfull! The results are: %s, %s, and %s'%(C, D, F))
Output: division by zero : You can't divide a number by zero

Mis siis, kui jaotus kehtib? Näiteks asendamine F = 7/0 ülaltoodud koodis koos F = 7/5 annab:

Output: Operation successfull! The results are: 7, 6.0, and 1.4

Kasutaja määratud erandid Pythonis

Võite välja mõelda ka oma erandi ja helistada neile hiljem oma programmis. See võimaldab teil kirjeldada oma erandit ja nimetada seda vastavalt soovile.

Sellegipoolest tuleb iga kasutaja määratletud erand (otseselt või kaudselt) ikkagi sisseehitatud süsteemist Erand klassi Pythoni.

Allolev näite kood viitab alusele Erand otse helistades RuntimeError sellest:

class connectionError(RuntimeError):
def __init__(self, value):
self.value = value
try:
raise connectionError('Bad hostname')
except connectionError as err:
print(err.value)
Output: Bad hostname

Pange tähele, et ühenduse viga , sel juhul on kasutaja määratud klass, mida saate tõsta igal ajal, kui seda oma programmis vajate.

Seotud: Algajate juhend regulaarsete avaldiste jaoks Pythoni abil

Saate teha kasutaja määratletud erandi, tuletades selle otse Erand baasklass. Allolev erand takistab aga 5 lahutamist 6 -st ja kutsub erandi otse baasklassist:

class errors(Exception):
pass
class sixFiveError(errors):
def __init__(self, value, message):
self.value = value
self.message = message
try:
raise sixFiveError(6-5,'This substraction is not allowed')
except sixFiveError as e:
print('There was an error:', e.message)
Output: There was an error: This substraction is not allowed

Praktikas saate kasutada varem määratletud erandit, kutsudes selle mõnes muus funktsioonis. Näiteks saate luua a floatError mis võimaldab lisada ainult kahte ujukit:

# First call the base exception classes:
class errors(Exception):
pass
# Next, derive your own exception from the base class:
class FloatError(errors):
def __init__(self, value, message):
self.value = value
self.message = message
# Create a function to add two floats:
def addTwoFloat(a, b):
if (type(a) and type(b)) != float:
raise FloatError(a+b,'Numbers must be float to add')
else:
print(a + b)
addTwoFloat(4, 7)
Output: __main__.FloatError: (11, 'Numbers must be float to add')

Kuna olete nüüd määratlenud a FloatError klassis, tõstab Python selle üles, kui proovite lisada kaks mitte-hõljuvat literaali addtwoFloat funktsiooni.

Saate printida FloatError klassi samas Pythoni failis, kus olete selle loonud, et näha, mis juhtub:

print(FloatError)
Output:

FloatError pole siiski sisseehitatud Pythoni erand. Seda saate kontrollida helistades FloatError teises värskes Pythoni failis, kus te pole seda klassi loonud:

print(FloatError)
Output: NameError: name 'FloatError' is not defined

Saate a NimiViga sest Python ei tunne seda tavalise erandina.

Võite proovida määratleda ka teisi veaklasse, et näha, kuidas need toimivad.

Muutke oma Pythoni programmid eranditega kasutajasõbralikumaks

Pythonis on palju standardseid erandeid. Kuid saate määratleda ka oma. Sellegipoolest sõltub teie programmi kasutamise lihtsus mingil määral sellest, kuidas see käsitleb erinevaid erandeid (olgu see kasutaja määratud, mittespetsiifiline või standardne).

Erandid võimaldavad teil siiski dikteerida, kuidas teie programm peaks töötama, kui kasutajad nendega suhtlevad. Vea põhjuse selge ja kokkuvõtlik väljaütlemine paneb ka kasutajad mõtlema, mida nad valesti teevad, ja mõnikord osutab see neile õiges suunas.

Jaga Jaga Piiksuma E -post Kuidas oma Pythoni koodi siluda

Varustage end oskusteabega, et purustada kõik oma teel olevad Pythoni vead.

Loe edasi
Seotud teemad
  • Programmeerimine
  • Python
  • Kodeerimise õpetused
Autori kohta Idisou Omisola(Avaldatud 94 artiklit)

Idowu on kirglik kõige nutika tehnoloogia ja tootlikkuse vastu. Vabal ajal mängib ta kodeerimisega ja lülitab malelauale, kui tal on igav, kuid talle meeldib ka aeg -ajalt rutiinist lahti saada. Tema kirg näidata inimestele teed kaasaegses tehnoloogias motiveerib teda rohkem kirjutama.

Veel Idowu Omisolast

Telli meie uudiskiri

Liituge meie uudiskirjaga, et saada tehnilisi näpunäiteid, ülevaateid, tasuta e -raamatuid ja eksklusiivseid pakkumisi!

Tellimiseks klõpsake siin