Kurso de Raku / Objektoj, en- kaj eligo kaj escepto / Esceptoj
Molaj misfunkcioj
Ĵeti escepton per die haltigas ĉion tuj. Foje tio estas
tro drasta: vi volas, ke subrutino raportu, ke ĝi ne povis produkti
rezulton, sed lasu la vokanton decidi, ĉu tio estas fatala. Por tio Raku
havas molajn misfunkciojn, kreatajn per fail.
Kiam subrutino vokas fail, ĝi ne ĵetas tuj. Anstataŭe ĝi
redonas specialan objekton Failure al la vokanto.
Failure estas nedifinita, do la vokanto povas kviete
kontroli ĝin:
sub divide($a, $b) {
fail 'cannot divide by zero' if $b == 0;
return $a / $b;
}
say divide(10, 2); # 5
say divide(10, 0).defined; # FalseLa sukcesa voko redonas 5. La malsukcesanta voko redonas
Failure, kiu raportas False por
defined, do la vokanto povas testi la rezulton antaŭ ol uzi
ĝin.
Failure nomiĝas mola, ĉar ĝi fariĝas vera,
ĵetita escepto nur, se vi provas uzi ĝin kiel valoron sen kontroli ĝin
unue. Dum vi traktas ĝin — ekzemple testante defined — ĝi
restas kvieta. Tio permesas al subrutino signali problemon sen devigi la
tutan programon halti.
Vi vidis tion antaŭe
Ĉi tiu prokrastita stilo de misfunkcio ne estas unika al
fail. Pli frue en ĉi tiu parto vi renkontis la saman ideon
dufoje.
Divido per nulo produktas valoron kviete kaj ĵetas nur, kiam vi efektive uzas ĝin:
my $x = 1 / 0; # ankoraŭ neniu eraro
say $x; # ĵetas nur ĉi tie, kiam la valoro estas uzataMalsukcesanta ekstera programo redonas
Proc, kiu ĵetas nur, se vi forĵetas ĝin netraktita —
konservu ĝin kaj inspektu ĝin, kaj ĝi restas kvieta valoro:
run 'sh', '-c', 'exit 1'; # la malsukcesanta Proc estas forĵetita, do ĉi tio ĵetasEn ĉiu kazo problemo ne haltigas la programon en la momento, kiam ĝi okazas: ĝi fariĝas valoro, kiun vi povas kontroli, kaj ĝi eskalas al ĵetita escepto nur, kiam vi uzas ĝin nekontrolita aŭ ignoras ĝin. La temo Ne ĉiu eraro estas tuja montras ĉi tiujn du flank-al-flanke.
Praktiko
Vin atendas 1 kvizo pri la enhavo de ĉi tiu temo.
Ekzercoj
En ĉi tiu sekcio estas 3 ekzercoj. Trarigardu ĉiujn temojn de ĉi tiu sekcio antaŭ ol komenci la ekzercojn.