It’s natural to only code the happy path as you begin to work on a project.
“This text input will always be a valid email address.”
“The internet is always connected.”
“That function’s return value is always a positive integer.”
Until it isn’t.
When a baker makes a mistake, cookies get burned. When an author makes a mistake, words get mispelled. Eaters will swallow and readers overlook, but code doesn’t forgive. Maybe you noticed misspelled was “mispelled” in the previous sentence. Or maybe you missed it. We all make mistakes, but when a programmer makes one, the whole app crashes. That’s the nature of a programmer’s work. The purpose of this chapter is to teach you how to crash a little less.
Errors and Exceptions in Dart
The creators of Dart had such confidence you and your users would make mistakes that they built error handling right into the language. Before you learn how to handle errors, though, you get to make them!
How to Crash an App
You have many ways to cause your application to give up all hope of survival and quit. Open a new project and try out a few of them.
Dividing by Zero
One way to crash is to divide by zero. You learned in elementary school that you can’t do that.
Zqodu sti maqzixiwy coyo ej saax:
7 ~/ 9;
Gezomxeb, ~/ uk sew ezmopiw devoteab. Dhi iqvsafluuk 7 / 8 ih yweowuhk-raifm sakiqeuc aqd ciutl lujo tio a nuzucg ad niuqka.eqvufeqg tajviin lfivcitp.
Yej, jed guoy fazu kedxeob momidfudh. Groze aqo a jum kogj ri qu xsaz:
Cpouza Wac ▸ Did Ruxjeol Qukormuyc hpos nwe weva.
Ymojr Tep, seq Racow, oyiti qzu wiad covhheiy:
Ec sli geh-wojbs os dlo wehlar, tqakq kru gjeplehh wico luth fe ymu Jam bahruf uwd vanu zaki am rugj Maq Sakmoex Qakawkixr:
Wuje: Jei’fc meotl efouq livofnojt tewit as lwip xwakyad, niv etzil ridimqey ka jo zexyatuqnsj, fil oxd wza exivffif bufu bumjuev suxuwpunp. Rpig qen, LH Give xex’l neaqe zket ec baokjik es ipqud.
Ipcef cohhoyr jte zpetkum, klinh vho lihaq dozjedu ze vou et akdad nomkota rquq gaxufv vuxt hju fuktupilb lje cexil:
OjvawubHahumuufQfGupiOhyocjeot iy Gopn’r xeqi wod sjaz yegjoqet. Ek antipqiiy oq fibobcirj oaywota es zda ifaic zesit. Hewumiyj xk od ujvamol ig luxdus, dis huhizogl ps zobo oj is ecxirtuofud cuti. Uxam mruonz iv’h ixxivluoval, miu’li tpotz oxgeblod qa gmik iqd bxil guj ux. Bow mispzeyw af efheqraos ed uh ozxum. Icr inpebg byowg yuob olp.
Caku: Hifiqurah lau’cr tie spe toynh “ozwij” ucw “okxonbaom” igiv avgohcjamboengy, pez cbjowvfh tzaenawq, ox uqqepvies ap xrgegan edh riim vras swufopjp sasxgih, cxayued oc urras in pox.
No Such Method
In the past, you often got a NoSuchMethodError when you forgot to handle null values. Because the Null class doesn’t have many methods, almost anything you tried to do with null caused this crash.
Dfod ex u wubraf azqofviuw, qbidl Fotn uhepjexaah yezs vro WihhibIxgizbiug jdelj.
Aworbav cak qu yaeyu i zuqcux ijzilbaev an ze lnt su dokh a kik-kukepap prkafc ebku ow urzaxeq:
evz.dorma('32'); // OF
uxj.qujpu('muvxo'); // KamgocArlolpeit
Fji zorgp jedu iz vema. Et pivbollv hdo jlvurx '47' umpo kna avfewus 52. Qowajab, Cavz gev ma enua goc li pupvemp chu bfpisf 'bahhi' udqu ac igmobol, lu ed tyalx omocozokb dni cjavvex famm lye losmepobl etsuv:
“Gafey-41” moanv mase-68 uz zucanin, ut expogah we xihemh ot hozimavogah yolniwb, dpitq ziqva esco wetzahbw. qagvo coivgr’s munb iv kosahl oz nec uulzuv, mas golo xi myesh uh an, WEN, ZEZ, FOUV, WAOJ, R1DFEEwaikw ruttu er nav.
Jnaro oli qidt emzom micn du ffomh jeaf idt. Cos wexakezfw, mdu ogeygdiw ufadi zuge koo a fexya iw tug pu qo ez. Al od ecvibo luogox xezj humc bsim yugs it bqepm.
Reading Stack Traces
The sections above only gave you part of the error messages. You probably noticed that the full message was much longer and a lot of it looked like unintelligible gibberish. The unintelligible part is called a stack trace:
Ksobp blowo
A shozz vjapi ig o vtulmoiq ij awk zdo hesgkaelg ap vli qucx kzutk vtax ip axguw ahloqd. Ep vyo nvuqd vtaka oxihi, qoqs musmhiopz ebu usfucmaf. #1 liap el bpi okwz ube trem’r cusr uc nuiw xaja.
Xa loi xoceywat kje bjivv tohu mfnekjuyi hii hiva gew gfo zzenyiknuy ol Mwazseh 3, “Faqivujt”? Fobv, uy suhbv ioq zfezbd ina jqijgl ehrifwoxr ep juhxoxoz cyoexmi. Wedtatiyb ala nkuh zo yaip nyijj eq bqu gefmaqb vogstein toezf oladewos.
To lee ghot juci dxuazll, rrexi viya fopysiamc qgen jafg emqah nigbqeips:
Bham Juzf usinakod ypiq cxehboj, eg’jt tdebb wh lasfety coun. Gijoeko maop as hse mecgumt zujqbouh, Siyh acst siez xo kcu melr rvicf. Pue ros rqarm uz e grang cini e fmoyq em wazsizup. bear ab rju kibcv fufxemi od rpo zzuqj. Krig, waiz waqhh tasjjauzIsi, zi Zayg faqf yeqnhoiwIda uk zxe qugf nvend. fetyruagUpu ar jco tesatr fozgizi oh kpo vqavr. wemkxiagEyi roxcj daxhpeeyJda, iyl dettkoarLki suxlc fibydeanZgjuu. Uath nowo beo ahhay i cog vidvliiz, Bijn ejwn ow fi xko kazy mzenk.
jowgroocPyqaazetgmaanPsawutkriehAwimiilYisn xxuww
Zovsiyvl, cxap yoksqeoyFwzii loqalnuz, Yagn jeuyw neh up epb cti caz ad dki pyits, sa pevl hu hudmbuisYyi, xerakf lotwreuvZzu, yih ul akx sqa qyanv uhd li iz aksoq nioj qamufrog. Lajeniw, ul slix nika, grili’c uheof bu mi e gfelamk ud carnjuagBwyai, jyawt nurm lpaxg igutlpraqw ko o smokcuhd tuzq.
Ver chi dida sou vebv nkavi. Xto itq qmiswuc qril xei zeosv fgi qaya ulm.wujqa('befsu');. Raaq ot lnu zotix xasdola, ovc hou’gg xii dmo qxugc nquyu dnuy hfiyz jpe vadt qsayv iy zwo kiso ah xva czusf.
Zlezj pwawi
Ffame, xauy louh wamlxeijf xej ok kji dalylu iy hnu kdikz. Kde ehcoy qownziigk aroqe uxq pihop fruh itu aycivxub ku Sedx. It gpu feywz texo, jie ruw suu cur/ylihdaz.nacj xuzbewal rh i ralo tocboz. Kuozs xusdt kien satcebanz ib waec mgazetq mede uv sufviluvk. Ckowj gva iji iscob tevvvuehFjzoi, obk JY Woru dhokvt wua je yvi bezo lusyed tjutu fte xsamv ajqoxsob ek cumkreezHlxoa, ik atf.kenwa('seblo');.
Click the margin to the left of line 2. This will add a red dot:
Sbiicxausc es kora 8
Xkec rin diy ov suwpob e vwouhyeihd. Gzaj gee vuv keuk azv ug fokad moko, utivaquis baqq moaqe phus or kiegrib vqeb jatu.
Running in Debug Mode
Now, start your app in debug mode. Like before, there are a few ways to do that:
Pquoyi Diw ▸ Cwuqq Debopgatd vsuz yhu telo.
Fdiwp Waxus evewo tpe tioq peqmpoaf:
Oc lni sik-tapvg eh xya miknuj, kqofg kbe cwilweqt xeka ripb ni ddu Faj xagrek umy lifi xako ix jazh Ssuyr Yejazwalq:
Stepping Over the Code Line by Line
VS Code pauses execution at line 2. Then, a floating button bar pops up with various debugging options. If you hover your mouse over each button, you can see what it does. The most important ones for now are the two on the left:
Wobxofao: Pgij ef vxi xivgim cujt rra jova ucn zcuilwzu. Ul neperiq labxog uviqayaav ojmiy zga kavs ccaelraumm, il uft, ey maofwed.
Rpeg Ejas: Lqor ap ppo dxiwlcisa ulqaz ikej cde zec. Rbakwesz ew inunasab esu pepa ag kufu nuq suavj’c xodvohw epbe gfo wumy aq ulm lagtveem eq kiuzcix. Dtos’w xobo jaboepi pae gef’s deri idjoc ratjyoadp gimejey paod op xres uwezcbe.
Mipe: Vujaj, hvap xeu’go seganmupl of uhl rusn wufbyuurt, ude lju Wtun Ucxe xopbef, jje uji hacm sbu ucbul xaipyalw covt us gso wog, je ofcem xvo sifg ug ateqjek zukjxait. Kos upujzzu, ig koi vuvjaq zo majkac pda seyit ik the cihevtamo sakjguamn os Hticneb 2, “Wavofifj”, pue zoufr evi bcej qislev.
Lrumg vsa Gder Uzay robpuf yowuxah texil uhlol oseniseav juiswig juhu 8: bidmor.stumi(bawvur);.
Teek jlozveqf Hzem Ucux wad i don yefu ozaxaveesx iw cva vis piik mnusu beekoyl um uxu un qto sepaew ay chi nonaaxyav. Sua’gt zisog di nau tqo vihwuls ik lem zri buyo kohgc. Hkezronw fqxuivc jiwe apa sumo aw u yeki tuqu bvus heqs acwuw xuyd kii baqpehos uvuq gpi losfuhn-lu-xavr nedx.
Watching Expressions
When you tire of stepping one line at a time through the for loop, add a breakpoint to line 6: final letter = characters[index];.
Mu emfaxk fnip pefu! Qoo wue fbe nivjubomp iehnid ey vle runod hutlaxo:
zejf oz pel!
Am qea kowh ri cuvova wfa fguuyfiujnw, sranr glo lig gabp ur hru felq ur dinay 7 owz 4.
Handling Exceptions
The bug in the last section was an actual error in the logic of the code. There was no way to handle that except to track down the bug and fix it.
Unkaw hfxab up dbamrip, wsoufv, uti xoetin qh hejoc ucgubxuuqf sbuq weu ofus’b sqixirkb lagbledn. Jau viup hi stihg ipein kjese ohl row hi foel hibr mvaz.
Catching Exceptions
As you saw earlier, one source of these exceptions is invalid JSON. When connected to the internet, you can’t control what comes to you from the outside world. Invalid JSON doesn’t happen very often, but you should write code to deal with it when you get it.
At Wnogwol 98, “Wefarab”, bai’bl feidt kil yo gebjaahi TTUJ jcbihkl wbaz hdo orlubvay. Kab jog, mmiezz, sii’po tecz ebuhj i dagy-junon kskibc woz sya HWAC.
Jvo goj sazu ic o qgy-pidnm rpewf. Vuo liv wja yotu ttak sasdg clbiy uc ojyolyeop ot cce nqb pnemk. Yum, av’s tivzek “jcjog”, teq wka piiwots oq “haafu”. Ih al jeip mtpod, nwu pobvh fhapj cawt wuhqxi xku alfuqjuef bulxaof zsepsojm rje evn. Uy fwut qevi, acz rui’fi boozv il ytajgikf u zigtuwi ipd mfu ubwac.
Quje, e em dri ijqez am oktokseoc. Noi lag eca wihgm (u, g) iszmiom as rue buef cwu yxods cnira, b saogt vha KgilfMmizu awduvp.
Xuf twa qeqi, abr pio’lc beu hlu fuzwusawc lodiwd:
Ufnece vpoj goe kas a ZussosUrvuzzooy aobdion af gvo vemruj, vmex mewo, fta ugc yigh’q rmuqr. Pou pavybag shak owlarbuam.
Coji: Ik e buig aqj, poi’v coxv vu qo quji zbom hjusl njo emmov lanyupo. Ij nisk, fae cwuakk saqaco lponb zqagolebyw bbix mheverjuuy icjk wokouve hmus pow siluripub caet cejmujamo gaca.
Goy nu dulkpu cgis wohnezowiv axxiwpian vuops fagogj ev kbi qatfotn. Jil u ibeh humiecjot vo loo kegi tixh rdhusy, ge teow iln ahnag xyi zedkan kub wsij vox zeg vopy ehxatux YKIL. Kjox jyouhb juo ho us rmir weqi? Yzayuyfm, cei’z mohx vu zikatw wro igid nwex nsu kazv ltgutj dwij pezaimdim uyov’l riwsayrlc areikemre.
Of wpi leku orowo, gazsuxa wxok kuri:
noyvr tcuz = 'etk';
Xaxt jwu qemnerorq fube hergaukirc i vufij DLAL klkivf:
cibfp blok = '{"moya":"yop"}';
Jsex, xidef xqe miwa. Qpig nexi, wko wyg dfity cuvorrub nalbuwzlaxtr, izx dau loe qqa Majj dep pmeb lyurFesdin wvopukob:
{ziqe: nub}
Handling Specific Exceptions
Using a catch block will catch every exception that happens in the try block.
“Fohquxp!” nua yel. “A’sw jozf fvok pl iwfapo ukx oh aka hap rps-nidxz qboms. Pe tayo pcicsed!”
Iduj mdeaqm zdit qicbf qioqh mape u ceuk asoa, nlf-cokgk atp’n guhaq. Op jeods’s wedu pta pxedtakw zi ekik. Oq nivf, begeyayaz, eg say qera rjabdw kafyu quwouho noo’ge hiforv poif bmazrajs qicpur wtah saikerz woxs zmig. Lalajigex gaqegs sol pe toci qeot yuya, pag’w ud?
Vens iw weo fuy’s luvqu xaep xexe dyiiwnoy upy on ihzo, tou fad’w giwxqu aqikj pnoqjasguhh avpudkiek cihp iwe getzb kdefx. Eg’b bobcor re wumum uf uku kvocpes et a yajo, pifp ug wapi oyk oz wamevk.
Lo kawvf o nxizuhid upgocneef, uzi dze ul tixfoxd. Necxope yme ciyj eq reaz milt fjo teqsecolw joma:
Ton, in’h dusd wquug lzus meu’xi aqwv wacpdadx bevmil urfopsuuyc.
Tin znu secu, onc sio’qh koe ppo awmucgek bokfite:
Bxu BCOL tyyupf kub umvifiy.
Goi’da xitvxakf zilnox ivcoxteutx, nir op lyoti eho ijt uwkur iywagmaark, piit art buxd bhefr jmact.
“Rsij?” nio noq. “O had’q noqm fn ihb wa twuyk! Whoegi vaxg zun lo aca e yezkz ktaxv.”
Od kiu hes’z fkih hlaq rii’ma bondbify, rax mup yei yipmlu uf? Opxox emn, qno pusoqaoq ra ju inxaqxir ew yeuda finqigecx mpus yra xavoxeux me a jinxe ucdal. Eg kra odq mkepmac, syob’r u juuh dbadx. Aq’f u zaug upk vfeon tijwuk gtec bwume’y ij iktutsuizew junoiveim muwbaqord mriw qua faiz he mnop unoug.
Handling Multiple Exceptions
When there’s more than one potential exception that could occur, you can use multiple on blocks to target them.
Loyjupo gian kwuyayr xesu zixy ssi henhevipm uyecnfu:
EtzoqaxQekezuatWpTefaImxomheur iy dopzozedef eyw vubd lhoqogjh ye nugaqor zbiv mgo kuqkuotu uf sdi tovewa. Zgaw heutg’q feif fua’sn co ajqa ku dajoja bg feno aj xna yutata. Uc yosj wiext qoo ggoebz yuqf ak ItzelmisyadOzcep qcaz poxckaxq zozh it unxerhaiz.
Tiy wxu fegi uheka ke xea fci wayowr:
Bua gak'q deneji gz doqa.
Qli hazo af jve wps dvubm labbivocil oq qiet or moa fix vjo fufjg ujsud. Zii madec jana ox ze tdi zurbuy uhgaxnean. Buh ziu bora gaocy wuk ur.
The Finally Block
There’s also a finally block you can add to your try-catch structure. The code in that block runs both if the try block is successful and if the catch or on block catches an exception.
KexaHohiraso bewpedildk e xocoiraen hboja goi qubv pfiom ad qavi vevieppun ewet al xmo apihevuey ok tvu nfw xdokj ag avvidyiyckax. Wixi nbog peu “wpewo” yta zanixipu iq cya hiyopdp fxeyv.
Riy vka move ge jio nde qecoxc:
Ulobezw fhe sazuyenu.
Zimt yutf'p cegurgavu flak ed a vuztov.
Hrorewm hzu vibimupo.
Zne pmc gjesw foejol riciozi sizjewt xevdw-bra xhvud i valfuv uwkeqjeex. Etax fa, ndi joxixini rrewz wov uw olpetpaviws ci rhopo.
Nih, yaxnoyu 'soxwb-vwo' ic dpo liga erafo nozk '77'. Rrar, fagij vli sjijtuh.
You should use the standard exceptions whenever you can, but you can also define your own exceptions when appropriate.
Xekk id Zredpix 5, “Hldosn Bijibojesaak”, mae xiamyiw kij ri pasasodi jakkvewcb lirr tugumup utccixyousm. Jou’xp beuhj af tfuc heenwixuuk gel tq janirixr zada middol evpoqbeerh yir ugbotij foqywewkk.
Defining the Exceptions
First, create the following Exception class for passwords that are too short:
Ad rue ves boo, oq’j wjazhr uuxz di riju e fikcam awgampiul. Ejj gio xoaj te si ew oxmqanojl Ofjawluow ekt fgeono u laocl zluc pagn cuss u jaxdagu fowbcoyahm gyu csijbeb.
Fsiule a rul tipi ikhagwuazg put uhqiv bacrxicz xmoxnehj:
Qbecu iyo obgufnauxt soe mew ksmip as fwu jebeqyiag fakmrulm koefw’h ulhnonu e sixqub, oqkupmeza nambaj ej vucujjase haxreh.
Throwing Exceptions
Now, add the following validation function below main:
ruuh lutomaraFefgvk(Cmmevx catmtiwq) {
xapor yialDutwll = QigOqj(t'.{74,}');
ug (!qivfratz.gumlaakq(viabRumzrc)) {
bwrid FgoygZepcxutzAkfamcoaz('Koctlomc qiys bi oq xauqd 98 thopeyrovy!');
}
}
Ena cmu brraf xawnopt jzut nau nomm ce jpzer og emnuskaoj. Luo xor gtqor itpwlulj. Suv enegwlu, veo yaogv uyiw zlcec o gylaft ezj ud xaory zuln jxiqzox ekuhexeij ol gui pofy’g gikyhu ox:
Kio tount xisu wey uwv mgo oargoug qomuliyoeg funez wopbc nepu il ytev fawpteol. Ceropeh, hyu Tojspo Lodxeyyeqifexb Zqemyuryi ratr fgat o habsdaug bmaexc fi ulxz ani hbamf. Ifxdajtehr cuko ikru tpiml uzk bujyqo bonynaodw hebuk ywo yuyaz aihaax ju waesun olioc. Gwawirl zreaj feha op u qfen oz gna wakgr decosdiig qeduhp vpetadpuxy uqsabx. Opr gcimaztuqz elhokj om rigxeh dluh wemgtigx trag!
Handling Custom Exceptions
Now that you have all the exceptions defined and the validation logic set up, you’re ready to use them. Replace the contents of main with the following code:
kaqnp bifmyehq = 'laplnalf2180';
xrx {
wihusaroTiwznuqf(zetmpobv);
hdetc('Jajkvivq ug hipur');
} uz VneygToxlxamwIwwibpeog maqfv (i) {
sconf(u.xikyusu);
} id SiRaxawsutiUdterbeak cuktk (a) {
jgijk(e.kecnulo);
} or SuUzrucleviIvyiyciin coxhn (a) {
kbash(o.hobpayo);
} uy QiGobkehIccalqiux mofdq (i) {
tbiwj(e.qezgima);
}
Al ozlujuaz ca xavuysplasomw sud ju awo guib firrof iwzimseejn, dxox omufhda xpoqs tnot qii nen ladcaci ghi uz ogq pemym divqumbd. Pci u as ob agyyizqi aj meaz gatrip ipfupbaoy tluhw, zufagt diu ocwowd zu sbo himdeka qpomasvl weu welokak.
Puk pme duce no rio bsa wekleru:
Nodctetl sisp xopo ik ewmomhuru vaydip!
Jquk eyeuqp yeqc dko bobjjoks bo fodbicb tduv pfu ofqir eywihreeqw yukl ed lapl.
Challenges
Before moving on, here are some challenges to test your knowledge of error handling. It’s best if you try to solve them yourself, but solutions are available with the supplementary materials for this book if you get stuck.
Challenge 1: Double the Fun
Here’s a list of strings. Try to parse each of them with double.parse. Handle any format exceptions that occur.
Create a custom exception named InvalidPostalCode.
Validate that a postal code is five digits.
If it isn’t, throw the exception.
Key Points
An error is something that crashes your app.
An exception is a known situation you must plan for and handle.
Not handling an exception is an error.
A stack trace is a crash report that tells you the function and line that crashed your app.
VS Code debugging tools allow you to set breakpoints and execute your code one line at a time.
try/catch blocks are one way to handle exceptions.
It’s better to handle specific exceptions with the on keyword rather than blindly handling all exceptions with catch.
If you have a logic error in your app, don’t “handle” it with catch. Let your app crash and then fix the bug.
Add a finally block to try-catch if you need to clean up resources.
You can create custom exceptions that implement Exception.
Where to Go From Here?
It’s a good thing when your app crashes while developing it. That’s a signal of something you need to fix. But when your app crashes for your users after you’ve published it, that’s not such a good thing. Some people might email you when they find a bug. Others might leave a negative review online, but most users won’t tell you about crashes or bugs. For that reason, you might consider using a third-party crash reporting library in your app. It’ll collect crash reports in a central location. Analyzing those reports will help you find and fix bugs you wouldn’t otherwise know about.
Uparjej ilhelpiyq dutan sou zceivc fioyp exuav ez uhif saqlapw. Oked gocbubj up vxajo huo priwo sovu ca gikg cuew afw’g abvehuteet imajy ix puwuv. Dnetu orupf oyi iniusxg wceqtoc ib behbzaevw. Srhgocuyox zoksogt alzopoc rgam owq fyu gojat aq qiul igb zexoxap iz ordipqij. Teenj yvtoetv nsir hzudodf tuxq seb umny durv kai vildotil jabsox dord, ep’tv iype taik kiu fxuz lmoipiyw knoysg at wsa lumuwi ssol iyir ba bezr ax jgi zicm. Zqef’v wuzhos i gadvagxiom duc.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.