Jeffrey Cross
Jeffrey Cross

Codebox: erandite käsitlemine töötlemisel

Codeboxis: salvestage anduriandmed Google'i arvutustabelitesse, lugeja Stairs täheldas, et visand lendas üles, kui tal ei olnud Arduino seadet. Kui ta kaevas seadme välja, ühendas selle ja käivitas skeemi uuesti, töötas see hästi.

See illustreerib suurt tööd protsessis, programmeerimises ja elus üldiselt: me elame ebatäiuslikus maailmas. Kena vähe visandeid alustatakse ilma Arduino ühendamiseta, numbrid jagatakse nulliga, inimesed jooksevad kääridega ja nii edasi ja nii edasi. Töötlemisel kutsutakse selliseid tingimusi erandeid, ja see postitus annab õrna tutvustuse selle kohta, kuidas käepide) neid. (NB! See postitus ei takista kääridega töötamist.)

Esiteks, kuidas töötlemine annab teile teada, kui midagi on tõesti valesti läinud? Üldiselt (kui midagi pole valesti valesti läinud), alustate visandit ja seejärel näete järgmist joonist:

Pange tähele kõik punased veateated sõnumi piirkonnas, kus töötlemine ütleb teile, mis on valesti läinud. Sel juhul on viga PortInUseException (), mis, kui alustate Googlingi käivitamist, on töötlemisel midagi ruudulikku mainet. (Lisateavet selle kohta hiljem.) Sõnum ütleb teile, millisel real oli viga visatud. Lisaks on tekstiredaktoris rikutud rida kollasega. Sõltuvalt sellest, kus viga esineb, võib joonise aken ilmuda või mitte, ja isegi kui see on nähtav, ei tee see peaaegu kindlasti seda, mida ootate.

Selle vea reprodutseerimiseks (või selle sarnaseks - vaata postituse alaosas olevat hoiatuste sektsiooni!) Kleepige tekst lihtsa_port.pde jaoks töötlemiseks. Kui kõik läheb hästi, loeb skeem seerianuppu üks kord sekundis ning kuvab möödunud aega ja sadamast loetud väärtust.

Muidugi, me ei taha, et kõik läheksid hästi (see on selle ametikoha punkt), nii et veenduge, et teie Arduino on visandi käivitamisel lahti ühendatud. Sa peaksid nägema midagi, mis sarnaneb eelmisele joonisele. Nüüd oleme valmis koodiga tegelema (või käepide, mis on ametlik termin) lahtiühendatud seade.

Töötlemise (ja Java, mille töötlemine on alamhulk) erandite käsitlemiseks paigutame kahtlustatava koodi „proovipüüdmise lõpuks“ plokki. Töötlemine "proovib" koodi käivitamiseks ja kui mõni erand on välja tõmmatud, siis teised "blokeerivad". Süntaks näeb välja selline:

proovige { Kahtlustatav kood, mida soovite proovida ...} saagi (ExceptionType1 e1) { // kood, et käivitada, kui ExceptionType1 visatakse prooviplokki println (e1.getMessage ()); ...} saagi (ExceptionType1 e2) { // kood, et käivitada, kui ExceptionType2 visatakse prooviplokki println (e2.getMessage ()); ...} saagi (ExceptionType3 e3) { // kood, mis täidetakse, kui ExceptionType3 visatakse prooviplokki println (e3.getMessage ()); ...} lõpuks { // Puhastage kood siin ... }

Kuna töötlemise alustamine ei hõlma erandeid, siis lubage mul vastata mõnele üldisele küsimusele, mis teil võib olla:

  • Mida sa sellega mõtled kahtlustatav kood? Esialgu võite arvata, et kõik koodid on kahtlustatavad, kuid eranditöötlust kasutatakse enamasti mõningates võtmetingimustes, näiteks faili lugemisel või kirjutamisel, andmete tõmbamisel võrgu kaudu või seadmega (näiteks jadapordiga) suhtlemisel. Tegelikult nõuavad paljud teegid, et teil on vaja lisada teatud meetodeid proovikogumisplokis või kood ei kompileeri üldse. Näiteks, kui eemaldasite prooviploki Google'i arvutustabeli koodist, ei oleks programm isegi kompileeritav. Raamatukogu disainerid teevad seda programmeerijate sundimiseks headeks harjumusteks.
  • Millised on need saagi avaldused? Kuna kood võib igasugusel viisil valesti minna, peame olema võimelised tegelema paljude erinevate võimalustega. Niisiis seostatakse iga püügiaruanne ühe kindla vea tüübiga. Kui tekib see konkreetne vea tüüp, siis täidab vastav koodiplokk. Oletame näiteks, et proovite mõnda faili failist lugeda. Fail ei pruugi lihtsalt olemas olla, mis viskab a FileNotFoundException erand. Või võib fail olla olemas, kuid kuidagi muutub selle lugemise ajal kättesaamatuks. See viskab EOFException. Või, midagi lihtsalt imelik juhtub IO oja, mis viskab rahe IOException. Iga sellise olukorra jaoks saate luua püügiploki. Võib-olla on parim analoogia, kui blokeerimine on-kui-siis-muud, mida on kirjeldatud raamatu Alustamine lk 64.
  • Mida tähendavad sulgudes olevad asjad pärast püüki? Need on funktsiooni argumendid - esimene tunnus tuvastab erandi liigi, mis peaks ploki tulekahju tekitama, ja teine ​​on muutuja, mis võimaldab teil kasutada erandite andmeid ja meetodeid. (Erandid, nagu kõik töötlemisel, on objektid.) Näiteks, kui teil oli selline rida - saak (FileNotFoundException e), see plokk täidaks, kui prooviploki kood ei leia otsitavat faili. Blokis on teil vaja muutujat e mida sa võiksid kasutada, et rohkem teada saada, mis valesti läks. Näiteks võite kasutada seda getMessage () meetod, et printida vea üksikasjad sõnumialale
  • Kas püügiaruannete järjekord on oluline? Jah. Töötlemine käivitab esimese püügiploki, mis vastab erandi klassile või superklassi. Kuna objektid on hierarhilised, tähendab see, et mõned erandid on toiduahelas kõrgemad kui teised. Järelikult sobivad nad peaaegu kõike. (Kõrgeima klassi erandiklassi nimetatakse Erand, mis sobib kõike.) Seega peate esmalt ja üldisemaid erandeid hiljem kõige spetsiifilisemaid erandeid tegema.
  • Mida tähendab „lõpuks“? The lõpuks plokk on valikuline ja võimaldab teil lisada koodi, mis seda teeb alati täidab, kas viga ilmneb või mitte. Seda kasutatakse tavaliselt koodide puhastamiseks. Näiteks, kui avate faili, võiksite selle sulgeda lõpuks plokis.
  • Mis siis, kui mul ei ole oma püügiplokkides täpset vea tüüpi? Lühike vastus on, et teie programm puhub üles. See on olukord, mida nimetatakse käsitlemata erand, mida üldiselt püüate vältida. Lõppsaagina saate lihtsalt lisada a saak (erand e) kui lõplik püügiplokk. See on kõige üldisem erandite objekt, nii et see peaks saama enamik vigu.

Whew. Aitab teooriat. Tagastame algse probleemi, mis takistab meie koodi lõhkumist. (Sellegipoolest oleme ainult pinna kriimustanud. Kui soovite rohkem teada, vaadake õppetund: Erandid, suurepärane Oracle'i juhend.)

Kuna meie kood lõhub liinil port = uus Serial (see, arduinoPort, 9600);, see on üsna ilmne koht proovipüüdmise ploki panemiseks. Me tahame, et kood toimuks, kui testida, kas sellel real on mingeid erandeid (me ei hooli sellest tõesti) ja kui on, siis kuvage sõnum „Plug in Arduino”. Niipea kui Arduino on ühendatud, tahame alustada loenduri ja praeguse väärtuse kuvamist jadapordist. Siin on koodi muudetud versioon simple_port2.pde, mis seda teeb.

Selle koodi käivitamisel peaksite nägema järgmist joonist.

Niisiis, mis siin toimub? Esimene asi, mida märkate, on see, et ma liigutasin rikkuva rea ​​välja seadistamine () meetodit ja joonistama () meetod. See tagab, et skeem testib korduvalt, kas Arduino on leitud; katsetes seadistamine () tähendaks, et see juhtub ainult üks kord, kui visand algab. Järgmisena olen loonud lipu, mida kutsutakse ardinoOK - kui see lipp on vale, tahame proovida sadamat haarata ja veateate kuvada. Kui lipp on tõsi, siis tahame seda porti lugeda ja väärtusi kuvada. Lõpuks olen ma sisse lülitanud port = uus Serial (see, arduinoPort, 9600); joon proovipüüdmise ploki sees. Kui käsk õnnestub, siis me seadistame arduinoOK tõsi. Erandi ilmnemisel jõuame selle saak (erand e) blokeerida ja seadistada arduinoOK vale. Kuna see kood on sees joonistama (), see kordab seda loogikat ikka ja jälle. Voila!

Hoiatused

Nagu ma vihjasin, on selle projekti erandjuhtimine olnud natuke keeruline. Näiteks teatasid Trepid (lugeja, kelle kommentaar selle postituse algusest välja tõi) ArrayIndexOutOfBoundsExeption. See tähendas, et kood puhub String arduinoPort = Serial.list () [0]:, mis näitab, et seadmeid ei olnud. "Ha," ma arvasin, et ma lihtsalt proovin seda erandit. Samas, kui ma seda Macis kasutasin, leidsin nimekirjas juba mitu seadet, nii et see ei püüdnud sama veaga. Arduino plugin lihtsalt lisas kaks uut elementi, nagu on näidatud järgmises tabelis.

Ei Arduino Paigaldatud Arduino paigaldatud
Stabiilne raamatukogu ========================================= Native lib Version = RXTX-2.1 -7 Java lib versioon = RXTX-2.1-7 [0] "/dev/tty.Bluetooth-Modem" [1] "/dev/cu.Bluetooth-Modem" [2] "/dev/tty.Bluetooth-PDA- Sünkroonimine "[3]" / dev/cu.Bluetooth-PDA-Sync " Stabiilne raamatukogu ========================================= Native lib Version = RXTX-2.1 -7 Java lib Version = RXTX-2.1-7 [0] "/dev/tty.usbmodem1d11" [1] "/dev/cu.usbmodem1d11" [2] "/dev/tty.Bluetooth-Modem" [3] " /dev/cu.Bluetooth-Modem "[4]" /dev/tty.Bluetooth-PDA-Sync "[5]" /dev/cu.Bluetooth-PDA-Sync "Eksperimentaalne: JNI_OnLoad kutsuti.

Natuke Googlingi näitas, et Macil on mõned protsessid, mis töötavad vaikimisi uute seadmete, näiteks kaamerate või bluetooth-seadmete vastuvõtmiseks. Niisiis, ma arvasin, et Trepid peavad olema arvutis, millel ei olnud neid objekte.

Kuid minu kood oli ikka veel puhub, kuid teistsuguse vea korral: gnu.io.PortInUseException. "Ha!", Ma võin siiski seda kinni püüda. Kuid see ka ei töötanud. Googlingi ümber avastasin, et OS X-il on ilmselt kummaline viga, mis muudab selle erandi püüdmise problemaatiliseks ja et te peate Serial Library erinevaid osi uuesti installima või kustutama, et need toimiksid. Nii see ka ei töötanud. Lõpuks lahendasin ma lihtsalt kõige üldisema Erand et see töötaks.

Siis tahtsin teha natuke rohkem selle kohta, kuidas sa vea skeemi töötamise ajal vead püüavad. Täpsemalt, ma tahtsin käsitleda juhtumit, kus Arduino on ühendatud, visand algab ja te lahutate selle keskvoolu. Siiski, kui ma seda proovisin, sain selle veateate, mis tundus tulevat operatsioonisüsteemist:

Kuna seda töödeldi toiduahelas kõrgemal tasemel, ei voolanud viga eranditult töötlemise alla, nii et skeem lihtsalt hummedly lõbusalt. Hmmm, ma arvasin. Niisiis, natuke Googlingist selgus, et on väga halb teha seda, mida ma plaanisin, ja et see võib viia igasuguste probleemidega. Niisiis, ma arvan, et Macil on sisseehitatud kaitsemeetmed probleemide vältimiseks allavoolu. Ma arvan, et ma peaksin olema tänulik, kuid see näitas mind selle näite eest.

Kõik see näitab, et programmeerimisvead on tõesti väga raske, sest nii palju on keerukust ja vastastikust sõltuvust. Ma arvan, et see on ilmselt põhjus, miks nii paljud programmeerijad saavad Makeriks. Kutsealal, kus 6 kuud võib olla igavik, on mõttekas teada, et seadmed, mis olete ehitatud käigust ja hoovast, oleks Aristotelese jaoks tõenäoliselt arusaadavad. Ausalt öeldes on uskumatu, et maailm töötab nii sujuvalt, kui see toimib.

Tänan teid, välja arvatud käitlejad kõikjal!

Makeri varjus:


Töötlemise alustamine Lugege arvutiprogramme töötlemisel lihtsal viisil, mis on lihtne keel, mis võimaldab teil kasutada jooniseid, animatsioone ja interaktiivseid graafikaid. Programmeerimiskursused algavad tavaliselt teooriaga, kuid see raamat võimaldab teil hüpata paremale loomingulistele ja lõbusatele projektidele. See sobib ideaalselt kõigile, kes soovivad õppida põhiprogramme ja on lihtsad sissejuhatused mõnede programmeerimisoskustega inimestele.

Osa

Jätnud Kommentaari