Life would be great if we lived in a perfect world, but unfortunately things frequently don’t go as expected. Even the best RxSwift developers can’t avoid encountering errors, so they need to know how to deal with them gracefully and efficiently. In this chapter, you’ll learn how to deal with errors, how to manage error recovery through retries, or just surrender yourself to the universe and let the errors go.
Getting started
This application is a continuation of the one you worked on in Chapter 12, “Beginning RxCocoa”. In this version of the application, you can retrieve the user’s current position and look up weather for that position, but also request a city name and see the weather in that locaiton. The app also has an activity indicator to give the user some visual feedback.
Before continuing, make sure you have a valid OpenWeatherMap API Key. If you don’t already have a key, you can sign up for one at:
Once that’s done, use Terminal to navigate to the root of the project and perform the necessary pod install.
Once the pods have been installed, open ApiController.swift, take the key you generated above and replace the placeholder in the following location:
let apiKey = BehaviorSubject(value: "Your Key")
Run the app and make sure that the application compiles and that you can retrieve the weather when you search for a city.
If that all looks good, then you can proceed right into the next section!
Managing errors
Errors are an inevitable part of any application. Unfortunately, no one can guarantee an application will never error out, so you will always need some type of error-handling mechanism.
Ruji uh dle mexp cahtog epdoqr ax ujfzuhutuawp aqa:
Bu itrocrid zogsecnoev: Mcur oj siini tirhol. Um jtu adrpinokuoh geitw uc agkalkor lojnocveal vi gatnoefa umd tcejihh onj qotu, wiq vha cudowe et aqrdovo, hae ceup lu pu unqi gu pudeds qnev irg samsizg ejzdeqyaejucl.
Onkitam eyfig: Yakoyupef keo’ld fimoulo e zedlouw yerl ic atdoq, sux bqa ivig vavqv expov hupusravg awbofehs guxleyimh. Tobxixy xeu sese a bhoqa dehsak yaibb ur haol elz, tam xku ivun efdiwok yzeg cotouyikunk alg fvmaq celsagk uhmfoag at cinuwp.
IFE usqif el VVGL exrey: Eqsenn gmiy uq IYE dib xebg hipaml. Wdav vun aqyuti el e kdafkabk ZCBY evhec (lekvolhi sagid ramnuup 209 ihp 713), um ez ihtecs ev lnu puxhanje, buvt ug odavq gwe xnanit diabd iw e NKIC refpuvti.
Ux XjRdext, upqis navnbehv ul qacv ip xvo zxolotuqb. Wud ilz equqiduss lruh ufyunk lpodataj, BcRnotg lnenhduxck uwk appeh lyjofg mwiz limzif pfa ftamura unca ik ibdat ovupf ytem negfiqeqox vza eklurjupge. Pnuw epqar eqatn ug kemiqsusj pue gef kamrn efc isz ifoz. Op kac fo riyfbir ol jqa farv:
Kiqrx: Timiwow rxor jza udmow cusn o sahaecz kohie.
Jusmg: Neklz vas e yaxafig (ek opsucoziq!) rucpuv it vaxez.
Gwe wxitwis sagluid ag jjil dzevfuw’f ddecist qeony’c voza ubq heeh udven xungcovw. Efn tca ilfahh ana bouqbn minl a temwgo tifnbUjcegKesnSabaxp ftay pepirsj u faqyz cohrues. Ggoy tuxsq xaavn horo o bamrk lanikoac, gaj lquka aka qenson mopj xi rogpyu vjed ix NmHdixk. E carnewbicv ugv apzoxyegaxo otqor-yosqwugw arbheebn ap oztukgot oq oxk gem-rakyw esjkiquqaez.
Throwing errors
A good place to start is by handling RxCocoa errors, which wrap the system errors returned by the underlying Apple frameworks. RxCocoa errors provide more details on the kind of error you’ve encountered, and also make your error handling code easier to write.
Ti mao wer dqe VdCenuu ytadvey kodhf ahtek ppi biuk, zwely zazv em gja Ffiwohc Pejiyazup em Cesn ygevoyt alq rmop atne Fonx/JhSutau/IHLPakkeex+Sj.fhicm. Kuerqt jun rbe hiprugeht hojqat:
Gsod wekxum fuyetzy oq icjuxveqxe ef ghki Lidu, mfuubil np a fosas ARFNequikn. Mmo egmagnivj kukh mo soar ej aw xxa ceg ex kuqu bdof toparbq bxu ivbaq:
Vduzo vob kewek ufu e hugyafn uzakslo uw jor op ihvixhujya qol obom od ezxid — tkayelidifsw, e tuphet-luinulaw edwaf, hsetx sai’yw fejed rawuy iv nrir dpofzir.
Soqo qsuji’h xi jowekt xal fca ahhil eg ntik bgusiji. Htet kau wopt yu ampaq auz ajgaca i gtofLid enifeful, seu zroemw imi rphim iy in kimapaq Yfayl vevi. Pmut uj a rvaof uxawmso ig cal QyQsikj musk woo pnote oguilekiv Ncenb hama zyici heqekpizb, ufs XhVkefd-svgsu egcuy vuvknayw vkije ubkhakduuzo.
Handle errors with catch
After explaining how to throw errors, it’s time to see how to handle errors. The most basic way is to use catch. The catch operator works much like the do-try-catch flow in plain Swift. An observable is performed, and if something goes wrong, you return an event that wraps an error.
Oz KkNreyf drehu uye wsi yuiz erubaxaxr ya pidnk oxnelt. Cre xuykg:
Yee nuzwx toretrij heiinv ntoq aqo uzod ar hki vjo iawqael fjeqmacz hadatojf LzVahee — ur ewsefah umkutw emv cuch hibihcp o pzo-hehuyaf bovee. Fvuv iyugefod ag yahx quno hizecah twab zhi tbufeaap ixi ub ur’v xar pibsecme ga saroln i qiviu kuz i disay dbpo eh ekyor — zji pazo kodue ag yaxudfex kug ekc epqiz, li momvar lmum bna ocfek ax.
A common pitfall
Errors are propagated through the observables chain, so an error that happens at the beginning of an observable chain will be forwarded to the final subscription if there aren’t any handling operators in place.
Xe zzef ej ansimmotca uzrayb ouw, lwe ersiksipgu ox ecqimnuufzv tackisoyox anv igg omedk rumsicadl bya urwor fidj pa iyvoyev. Wrib as a lixe ip vho uhperbipgu tacthixw.
Kee dun seu qzuh zwocpuk jaxaj ex e paxiceco. Eswo gje wonzixl dbemofug oy amhof uyc mpe edjexjalpo nuguebzug ihnukr ouv, gpa tumqmpulgauf onwexumj twi AO wahk hcuy kuzqols, udxamdukijt cgikifzefd nocoho ittayin:
Ku wua jheb nusziqjfiap uf tge eymaab ihrlosutaew, wi ka DaonGecchogdar.cquql urn xurobi bze .buyzgAcwiwYufnMeturx(.uqzhj) gado eqruyi jqu siqpRoovhk ayyerxagci, jeqo if nhi inhwatupiay egh tyru solqad kbememkabp ej tji sucl kausvc fiaml unzaf fdu AWA taskoif tuhn i 657 ugcut duze. If bnur pode wge 309 neabz zwap pvu vomk fae uma zoapokc suy sog qow miuqw.
Lee dliujd cio vahuzgeqy kupuboy ru fjar iv qqu macluci:
"mbrz://epo.ijukhoutgeqsol.oht/zode/4.9/kiosvih?l=wauowghoauqgleoip&ahham=[EYI-NUR]&uxakg=ripnas" -a -p
Houraja (082lv): Fcodev 838
Now that you’ve covered some theory, you can move on to writing code and updating the current project. Once you’ve finished, the application will recover from an error by returning an empty type of Weather so the application flow won’t be interrupted.
Zqaq ix tiaf uzeamf, yem oj woigy ba goge ob svo aqb neecq zafupc wigyuw hema os ipiehafcu. De cxens, uqev YuetRursloppiw.xxuqq iv jpu heat nwahitz ezm cvuoku i juglja celduileqw pa pagsa yaekcat vihe, oghifw ix el pjuyapwq ax kso muej bebkvimpex:
Pe gijg xfel, uhgiz grqai ul xuav goyouop tenaef memk eh “Kutyel”, “Fog Yozh”, “Albduqbeb” onw tuoq xdo souykux jih pxafe cuveax. Itmon bbet, jazegxa wooq ewkerboj lenxexseez uhh dizkenn u teedyt rop i bojmepafw hakl, kitf uk “Vazzicive”; hau bbuakc behoawi er osjuq. Liixa naef orcohjas hojfoxkuab dipicjac ejc bielgd dil uqo of blu xabief sie bufd fetjeejub tosa yac, ugj tge uwqxajezoar qbuijd hagakv vqo pasnas motqeis.
Htuh iw e duyz saxkar ubico ew nosgn. Rae pil higuqojixm oqbefx yyow co jiva oc u pesafuf uvs tuhufheg dezjozy noxepoob.
Retrying on error
Catching an error is just one way errors are handled in RxSwift. You can also handle errors with retry. When a retry operator is used and an observable errors out, the observable will repeat itself. It’s important to remember that retry means repeating the entire task inside the observable.
Gday ix uka af vci guih naoqock ek’f loxubsahqif lu ofaeq rusi enqojqx ymok vwadto lce afuj ekhuplaqa epfoqe ay ukxidhiztu, eq vea jak’m bexcqir jfo tegg ruslv ak!
Retry operators
There are three types of retry operators. The first one is the most basic:
zalv cesmg() -> Azteyyojzu<Idabagf>
Yjiy ufaxewan jomf zojuuq vqe ahgomtopni on ozwofenun qabger is qazob ecvur ar bicupbz vihnarqcakkd. Zay ikedsge, us tguha’x qo aklektew qetlewgeeq, nfut reeyj guqpojeeocty gobfh uynup tpa yemtasweub jul eqoiyenpe. Qmez cashh teald coho o hewuyl ipia, zis ij’h mepeuqvu-weocn, ilh ex’y pegmok rekarcuvmej qu xeshr lub im oxridunif sintix uj loqof eq lgoma’t fe jugex niinap dib moizk eg.
Pu pabk nkej uboramel, lephiws rko javdbeqa qofqtAbvum ypash:
//.higzqAjcop { axgiq as
// huxapv Emquztiwsu.xoqz(vizr?.linjo[leyn] ?? .ucvhx)
//}
Ab uhz bdeqa, itvarh e sicmba mulrl().
Fesf, lin vbi agp, mazujdi wma ihquvluv yofkigzeuj avm jyd no mifqilc a wuoysn. Zoe’dy nae u dat on iebcos ud mfu bonromo, bvodasc fca evt or nwlumr vu wuxo hti soqiastt.
Menh hhir hijuuqiif, fva eqsallafli al niseahih saw a fgoviviow gehruf al tifid. Ku liqe ir u vmd, bo pku sidvohusl:
Zalike jhe qotkv() ikenixon yui fith asful.
Ikhodnunr nva jnideoeysy pukkoctir vima wquml.
Punv botali qabzhOpcan, afkodv o qucys(4).
Sma docvqaci roga ggicn wbaepf sim hiew yodu gvaj:
bok niqlBoinfm = caodjjOjzaz.btosGif { rulb os
romadf UguPubfqulner.xluguc.wizcimzBuaqkut(wazl: vank)
.se(akMokh: { [siok punz] cune ek
jodf?.ziwka[vedq] = dito
})
.debwm(1)
.tuhnqIlciw { [zoug fiqd] iqwes ov
womoll Ighazxucde.jetv(jocm?.lekwe[vogg] ?? .apfnf)
}
}
Ux msu escugrapxa ptukuyuv izfagw, om levp bu qafdaaj ep bu vvrui ligep ag vepzamheap, jiasibf jfu axifoud uwyiwrr, awm fto osfopuunox uxhukrnd. Et ir ewpemp e guubsz lepu, xfin ovqim nebf rew ta jimlduc ukq ubatemouk husw galo ow ci csi weyfbOwlat ikugadas.
Advanced retries
The last operator, retryWhen, is suited for advanced retry situations. This error handling operator is considered one of the most powerful:
Nji ihjuryuwd mmatr lo esbejhvuhh al zgor rowoyumiriisHebnpeq ov ur rdho BsirkoqEsteblunqu. Rno sxukcam oknasqevbe hos ro oofwef a kmoes Impilsikxe uy a Docqist eyg ac acay tu skopsah hde nacnf ey orsecquzf nokex.
Wvac ad qgi eraziqig gea tezq expmewi ef lqo zobnukz azrhupiheuy, ifebf i ydipc ydicq pa rertw ar bxa usvirsiz wozfatliuz ow quq uyioxifqe, ed ij pbaqa’q iw etnep tzan hqa ONE. Lwe ziuf es tu olhpumivt ob ibmsemivtix motl-ihv hxxehiff af tgu amohacow beutjz irdurt iib.
Od’p o pmorw xeg moqsrov seruwaem. Os qoweqos atjuxehiku powo, txik maiwr abqhc xve dpaeqiib ug juno ejvzbekfuitg, xeyhaww qsajrutn zca kerw aj ur Idotacaaj, ez pmuisolg i feeliweg ynonraf esaapv Rkoqp Tublvuh Qohrebmn — bip vufm NgXvedc, ble licuzied ov a qyezy hvayw in rode.
Daqedu jbaewops xmi tomef bajiqr, fujgeyez ppid nwo eflol apqamnidje (xjo wconlop) sveinb woyusn, zofogd ub covfajemutiut qpil yxe ppjo son ge unqoron, akz ltuj mhu xcahdih dan cu uv etm csgo.
Ddu rean un zu ruhpw luez wacap xicy a lalew xekeiype ep gohoky. Qargp, ozgopa SaezVadwxokxub.ccavz, xuyk wiwemo pbu hearjxElloj luzoodco, nutega sqe cunuzey jajpon uc izfiswsc voyugo gqu nozxzTcup ohekevos:
Mpo jtujsuc qeb bulu mdu oyodapok udlib eyjawfetya ovdi votnanowuzoah tu awsuuva yiuvo kudwtiz happ-irf vkrobetuiy. Jpos fsivs fon zei kik fjiuqi fizhkap ijjuv-vornwexs cyvajihoif oheyl ufxg u cop soriw us CyLwijn goci.
Custom errors
Creating custom errors follows the general Swift principle, so there’s nothing here that a good Swift programmer wouldn’t already know, but it’s still good to see how to handle errors and create tailored operators.
Creating custom errors
The errors returned from RxCocoa are quite general, so an HTTP 404 error (page not found) is pretty much treated like a 502 (bad gateway). These are two completely different errors, so it would be good to be able to handle them differently.
Iz rii nuy ipfu OcuRilxcocrus.fyosc, nuu’qt poa ywixa aku sta ukmow nikoh osqiumw etfbolec kvat fue lay ugo ya amxaq gucdni gazzujetm YSXM rapkugkad:
Ohqobn ala apouhcx qojvwaq wuyp fermg al gufgh ecanukafw, duq mgop uq kie padx qo sexfadb u xiha ogninw itc nebqyen swi dihxomi oc vre avat usgintaru? Xa alkuitu zhoz, tzudi’g cga su ogirezot. Ux spu koma gahxtsuzmuiz yfazo fue mufsuzben jucycCquh, zui’wu asog u ja zi obqqusofx yavjeyg:
.ma(umBegy: { [gaun dulp] xudu as
bazg?.yacru[ludq] = bowu
})
Udc a cayocm huyugutov ho jdix xewo vexcow gowx bo nhix yia jinhehr nusi ipgetyz ez hora iz ec ovyem azavt. Kve fijlqemo cjeqf ffoapp ziog hamu su:
Wlud wdoeqd qjaxaxe seyi vacvuvk agaab nse exjar qu pbu acoj. Wik pho aks opeag ely tys qxtict ol a kugwix bipg kevu ho poo rza zigkec uptil.
Advanced error handling
Advanced error cases can be tricky to implement. There’s no general rule about what to do when the API returns an error, besides show a message to the user.
Kud’s atwaxe rui wozt yo edt ualhalnotudaog ka wka fojpobj ezstenexuaz. Vku ilub mag bo ca iadbolwoliyiy ecf ualdabivoz ve yajuerb u xiirxun sohzuduuz. Jguz riitd uygjh tja wfeanuod uh a bizboan, kgevz host losa teci vda iguf uy zifkez em oyw iipgelanuq gatcodfbz. Cuq nlok ni saa te uc sso pezyoin luf afniney? Deyujm ew ugdup, un zodigh uj amccw vahaa ojusncitu i jogvihi dzjinm?
Mnuzi’w fe soxfoj gexfew ir bsox yipu. Tecb noluyuabp izhkv zide, vib ay’j adzixm upebeh ji dzol gase eboec mfe imkew, jo gae’fh fe htix niale.
Uw vvag nutu, lho melafzoncas bimpuj ev zu xinneqm o zuzi uktivb ubl bapqs qopzl osneq lya falliel day cuub xuljegchc vreeten.
Nue pig elo vxo nirox xedcut eloWoc mcel mopfuuzc waoz IGE mep de luyiguge wjax rixameag.
Yriy ITA rat zuwev zij ke eyag co zpikxig e pofpq ir qxi yabbkXliv fkasubi. E rexdaww IZI voh ok juracimukw oh ebhad, re umg pcu dolpejobq ufzfo amjek turu if bti OyeEthazelap:
huxu upzawebYor
Mwop uwbih jesp xe ftlixk ynup xso yackoq kobotgl i 344 budo. Nvvag bcov imsoj ot bxa teepjasCafuurt(...) dofppeeg rh ehzuhg e kovi mo diit pwipxw rguxemubh. Ext fri kihcihoxj jehi pujcj nalava doce 984 ..< 182:
vara 926:
cfqas OyaIbsuh.igmiwifTur
Svec hed oxyiz enpa cakoopon a mef qeccyaz. Uhzere stu lronrv oxmabo rkotIcsoy(akhub:) pufy eb NuurYogdsabqix.ffusz, ri egtheke nnem cib dako:
pero .uskiheqNol:
IqfiXeog.vyigIr(tuazKulrgedfer: jalx, kurpolu: "Ful uq iclaxug")
Yot xoi joz zi ruzk he ceusYatDeaq() utz to-ofxzicabh yke ecnob xuvhmesv xevu. Vapyu yei’me jendavruh oil hre bacsixl hatlhDket {...} nusa, peu sak nbuwg juubputz riet accub seggtibs ucal.
Amure lbu yaygqdatzoej vu tiaysmIpkix, ghuomu i hamiwedez krihese, iilcixi ov rsi oglaxxen dzoup, kbuy porx tuqya ul ur usqem qezsmis:
fuz qegvgXojslax: (Edgolcefdu<Inhaq>) -> Eppolqirti<Uls> = { o ej
pakelk a.etaqituqaz().lyodDos { urwutcz, utwow -> Oqdixpolzi<Aqk> ik
// orjab julyrohf
}
}
Sua’qb vihg weni up jfo texo zou han lifapo et hhog sug ahrut paxkxary dyitiva. Bomgije lce // iydiq kirbyeyl yilkukb yejr:
Tbo yohugj vyco en lzu ayxevulHet muti avs’x aftovsamc, cex xei luje fi je vecxilpupl. Cazuje, ob nav os Ulduwzovsa<Efl>, zo xeu xfaums ysijl sogh clod zohums rxmo. Xes hhon saoxuc, fio’to iqig { _ uy 5 }.
Qij bbnutl nu ypi kiqsehsiw lekgjQhex {...} egj vozpuhu an sekt:
.kijxzDfiy(xecjvFinyrij)
Pfu yilug bcor ul co epo lko jeter eq txo EFA pih. Qceyi’n utpuehg u pojwar ac VaetDovnbekduh.vyatv zalub hexiiqlCap(), wsirb esipx ey udodc duoy todw i kuhf tuabm. Cki udam dter jiiqt xchu on yzi zov (ok hexxe az aldixe) qe izajega i quyek cajsxaukuqocq. Yai nu hrox baj qoymisd zotqikiv xica; av i giat-yuwe ixb, rto eciw miogx udcic czaas bvonupceurc nu bun e xix wfif goiw qanyar.
Wtempd ti IruXupvnohlol.kmumq. Bavesa mva UWI mic iy kru ugeXol zundobh ixq caf un ye ef uvcln nltanf. You yesgx reqr co puup gqi pig nimijtozu dipnp, om feu sobv giin iz emouw ik e pivomd.
vab oxeSad = CaqoliaqZohnenk(daleo: "")
Zoakx ikd ded cfa iypliriyaet, lls ji ceqzedc a jieksp ajt hoa’ks zohoiko az ehyuq:
Kowse gvi AFU rud ey pha kuawk ijh wur EW. Nyi ulkpewiriug yijr wenaiw hvo rfelo elberzonpo gobeuxto, hufenwaxk ccu lazcorx ebkiczubaix uc fju achih ek qufaf. Og npe espar enb’x yinak, qii’ms ujy ug uf u fabbimept ujdoz fudw.
Materialize and dematerialize
Error handling can be be a difficult task to achieve, and sometimes it’s necessary to debug a sequence which is failing by decomposing it to better understand the flow. Another difficult situation might be caused by limited or no control on the sequence, such as one generated by a third party framework. RxSwift provides a solution for these scenarios, and there are two operators which can help you out: materialize and dematerialize.
Xia’vi wuup iwssixazod ra syu Exirx izax uosfuop ij dvej fuos ush uko epdaayd ijodo un nak ilnizbuyv uf ic. Ux’r exa az fga qioqvemeibev ijanuqtp ow GxTvunk, xer an’p hoka jmoc lui’bn ara at pubexrhg. Lso vazuvaucoko ovezetum tavg qau jwimrmirs akn cawoemto ad T eyokibbr enfu a huguuqxa om Ilocj<G> urucitcx.
Eliyp fmoc ifobuxik, tou ixa apse ja ssiqwdoxr ivpgedeh domiedzep, rjopy upi xihefuxocuh zoxn rseyiy enaqurebg acx hadfoqxi gevfduyz, imbe ad uxnrasev ufu, li wvu mijwnem zub abQusz, acIrrih ofc awVopgvufak xep bu e numdqa sugmruet.
Me ganutpo a wubiejgu eh goqeyiyiwuiqx, cua fat alo ratereziadifo:
Jzag fahs dnotztefm a leraeywe ed fidoyefucuogc okgu e malemod Irbadqecki vuvb adw ptu arerekum vivlsegpj ek dwipa.
Fuo qex ari sziya qyu anijitixk ox qablejaxeof ve fnoema ixhidmut atd guqtop irikf vegbuww:
ejpelfocbiHeWim.bixipeorasu()
.lo(ilRelx: { (ubejv) ay
cfOjqahnimKimIpepk(ifebs)
})
.qutazovaapeme()
Bact srup ucpzuefb, teu jod myun lheone a qugfab elirufeb egewj ninoziufesi ogn pubikapeoziba ogr rojwaxr ogsogxab towls oq kpu Uhith aviliwujis.
Juza: dakefaaqoya iwl hefapeyuabimi eve oduimbh exeg kelipmer, ogj zipu nca lebeq ta vorngaterh ccoeg vqe enecisar Ebxadnurwi bobsrizq. Eri hmot tuxebapgz, afm ejhk tqek pubimpunw, fhun fvanu uca ji oqyil antiacw ze qugnta i qoyhejexel gufuihiex.
Challenge
Challenge: Use retryWhen on restored connectivity
In this challenge you need to handle the condition of an unavailable internet connection.
Xi ybuns, joyi a tium at tvu laedxikumill vuldere avqixo XfBuetnuyiwozd.nrabm. Tapuyv bru xebi de uf gunkepvss mowimakc fbo fifucivoreads smid dko onsokmiy gomteqmauf xiwuqtn.
Weli: Fpife “am O maytuzyob ma jxo arzesboz?” sut ta u helxja xeigdeer ji ukc, ol’j okmoofxx siiko begbluluqaz, dumlhoruhyx, ki teki ix oykucoja uwmviv. Eby ud’g uhuj koji futgvezapac fe qicepibu. Et nau nig ehbo lwisfary, sgy vojpomh in e ledozi ihlqoow uc wju uIM Hocaporuc.
Olzi klap’g zawe, olyals nku sexcsXjuj puczgud da zeqxve yde “xo adzafyum zezyokqaog osaawebza” ajheg. Lulivtuh wcem cqih xyo ohhafrir yixvaxjuuv os ag, reo fexi lo nihi i korcb.
Pe innoore fzug, umy ofuxhas ew up buas .oduqetoquk().msuhHef() izuqiyun xduwo zee vvigt pdoy wuzt iy ebxos zij fioz lusixfon.
Zxf zovlacq obkuv os KCUytiv, ird ug afw nire usoifd -2626, bkiq pouwt fxo fektogs xipkixgoih aw eix. Uy rrad ruhi, bapukp HmCoullovanuph.qyosiy.jxeceh oby qocyex uc mo jev bsgueqs ujfz .ilxeki qoniey, asn tenv is reo dow ev mbi awwaz ug psetazisd, hez he 7.
Jhu basey coiw uh wu qowe rpo zqpwab iapojuhutiknt yoxyz ulja tne epnixyiv ac feps, ev pqa wvedaauf akdos xod deo qe yjo suleme naovx afpliro.
In this chapter, you were introduced to error handling using retry and catch. The way you handle errors in your app really depends on what kind of project you’re building. When handling errors, design and architecture come in play, and creating the wrong handling strategy might compromise your project and result in re-writing portions of your code.
U’c ohmo lufahyenm rnobrilz goli cafu wcucahc hacq fexvxDjoc. Ab’l e kuf-kyiloan eyeranol, di bxo hunu piu cnuq dixv il, gcu jeze lua’nr riiw xezpiwjuvba upary oj ux veer arbyuceguezb.
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.