Jeffrey Cross
Jeffrey Cross

Kódové pole: Zpracování výjimek ve zpracování

V Codebox: Uložte data senzorů do Google Spreadsheets, čtenáři Stairs zjistili, že skica vybuchla, když neměl připojené zařízení Arduino. Když vykopal přístroj, zapojil ho a znovu načrtl skicu, fungovalo to dobře.

To ilustruje velký bod o zpracování, programování a životě obecně: žijeme v nedokonalém světě. Pěkné malé náčrty začínají bez jakýchkoli Arduinů, čísla jsou rozdělena nulou, lidé běží s nůžkami a tak dále a tak dále. V procesu zpracování se tyto podmínky nazývají výjimkya tento příspěvek poskytuje jemný úvod, jak se vypořádat s (nebo více oficiálně Rukojeť). (Pozn .: tento post nebude bránit běhu s nůžkami.)

Takže, nejprve, jak vám Zpracování umožní vědět, kdy se něco stalo? Obecně (pokud není něco velmi špatně!), Spustíte skicu a pak uvidíte něco jako následující obrázek:

Všimněte si všech červených chybových zpráv v oblasti zpráv, kde se dozvíte, co se stalo po zpracování. V tomto případě je chyba PortInUseException (), který, pokud spustíte službu Google (Více o tom později.) Zpráva také říká, na které lince byla chyba hodil. Navíc je v textovém editoru zvýrazněna žlutá čára. V závislosti na tom, kde k chybě dojde, se okno náčrtu může nebo nemusí zobrazit, ai když je viditelné, téměř to určitě neudělá to, co očekáváte.

Chcete-li tuto chybu reprodukovat (nebo jednu takovou - viz část Upozornění v dolní části příspěvku!), Vložte text pro simple_port.pde do Zpracování. Pokud vše půjde dobře, náčrt přečte sériový port jednou za sekundu a zobrazí uplynulý čas a hodnotu načtenou z portu.

Samozřejmě nechceme, aby všichni chodili dobře (to je bod tohoto příspěvku), takže při spuštění náčrtu se ujistěte, že je zařízení Arduino odpojeno. Měli byste vidět něco podobného předchozí postavě. Nyní jsme připraveni přidat kód (nebo Rukojeť, což je formální termín) odpojené zařízení.

Pro zpracování výjimky v Processing (a Java, jejíž Processing je podmnožina) umístíme podezřelý kód do bloku „try-catch-final“. Zpracování pak „pokusí“ provést kód, a pokud jsou nějaké výjimky hozeny, jsou „zachyceny“ jinými bloky. Syntaxe vypadá takto:

Snaž se { Podezřelý kód, který chcete zkusit provést ...} catch (ExceptionType1 e1) { // kód, který se má provést, pokud je ExceptionType1 hozen do bloku try println (e1.getMessage ()); ...} catch (ExceptionType1 e2) { // kód, který se má provést, pokud je ExceptionType2 hozen do bloku try println (e2.getMessage ()); ...} catch (ExceptionType3 e3) { // kód, který se má provést, pokud je ExceptionType3 hozen do bloku try println (e3.getMessage ()); ... } Konečně { // Vyčistěte kód zde ... }

Vzhledem k tomu, že výjimky nejsou zahrnuty v tématu Začínáme se zpracováním, dovolte mi odpovědět na několik obecných otázek, které byste mohli mít:

  • Co myslíš podezřelý kód? Zpočátku si můžete myslet, že všechny kódy jsou podezřelé, ale zpracování výjimek se většinou používá v několika klíčových situacích, jako je čtení nebo zápis do souboru, tahání dat přes síť nebo komunikace se zařízením (například sériový port). Ve skutečnosti mnoho knihoven vyžaduje, abyste uzavřeli určité metody v rámci bloku try-catch nebo kód nebude kompilován vůbec. Pokud jste například odebrali blok pokusu z kódu tabulky Google, program by se nezkompiloval. Návrháři knihovny to dělají, aby přinutili programátory k dobrým návykům.
  • Jaké jsou všechny tyto výkazy o úlovcích? Vzhledem k tomu, že kód se může pokazit různými způsoby, musíme být schopni zvládnout mnoho různých možností. Každý příkaz catch je tedy spojen s jedním konkrétním typem chyby. Dojde-li k tomuto typu chyby, provede se odpovídající blok kódu. Předpokládejme například, že jste se pokoušeli přečíst některá data ze souboru. Soubor prostě nemusí existovat, což vyvolá FileNotFoundException výjimka. Nebo může soubor existovat, ale během čtení se stane nedostupným. To vyvolá EOFException. Nebo se v IO streamu děje něco zvláštního divného, ​​který hází krupobití Výjimka IOException. Blok catch můžete vytvořit pro každou z těchto okolností. Snad nejlepší analogií je blok if-then-else popsaný na straně 64 knihy Začínáme.
  • Co to znamená v závorkách za úlovkem? Jedná se o podobné argumenty pro funkci - první token identifikuje typ výjimky, který by měl způsobit, že se blok spustí, a druhý je proměnná, která umožňuje přístup k údajům a metodám výjimky. (Výjimky, stejně jako všechno v procesu Zpracování, jsou objekty.) Například, pokud jste měli řádek, jako je tento - catch (FileNotFoundException e), tento blok by se spustil, kdyby kód v bloku pokusu nemohl najít soubor, který hledáte. Uvnitř bloku byste měli zavolat proměnnou E které byste mohli použít, abyste se dozvěděli více o tom, co se děje špatně. Můžete například použít jeho getMessage () způsob vytištění podrobností o chybě do oblasti zprávy
  • Záleží na pořadí prohlášení o úlovcích? Ano. Zpracování vypálí první blok, který odpovídá třídě výjimky nebo nadtřídě. Protože objekty jsou hierarchické, znamená to, že některé výjimky jsou vyšší v potravinovém řetězci než jiné. V důsledku toho odpovídají téměř všemu. (Vyvolá se třída nejvyššího pořadí výjimek Výjimka, což odpovídá všemu.) Nejdříve musíte nejprve vyjmout výjimky nejtypičtějších typů a obecnější výjimky.
  • Co znamená „konečně“? Konečně blok je nepovinný a umožňuje přidat kód, který bude vždy provede, zda dojde k chybě nebo ne. Obvykle se používá pro kód čištění. Pokud například otevřete soubor, můžete jej zavřít v posledním bloku.
  • Co když nemám přesný typ chyby ve svých blocích catch? Krátká odpověď je, že váš program vybuchne. To je situace, zvaná neošetřená výjimkaje obecně to, čemu se snažíte vyhnout. Jako poslední úlovek můžete jednoduše přidat úlovek (výjimka e) jako poslední blok. Toto je nejvíce obecný typ objektu výjimky, takže by měl zachytit většinu chyb.

Prudce. Dost teorie. Vraťme se k původnímu problému, který zabrání tomu, aby náš kód vyhodil do povětří. (Přesto jsme se jen poškrábali na povrchu. Pokud se chcete dozvědět více, podívejte se na lekci Výjimky, skvělý návod od společnosti Oracle.)

Vzhledem k tomu, náš kód je foukání nahoru na lince port = nové Serial (toto, arduinoPort, 9600);, to je docela jasné místo, aby se pokusit-chytit bloku. Chceme, aby kód prováděl test, zda na tomto řádku nejsou vůbec žádné výjimky (na čem to opravdu nezajímá), a pokud existuje, zobrazí se zpráva „Plug in Arduino“. Jakmile je zapojen Arduino, chceme začít zobrazovat čítač a aktuální hodnotu ze sériového portu. Zde je revidovaná verze kódu, simple_port2.pde, která to dělá.

Při spuštění tohoto kódu byste měli vidět něco jako následující obrázek.

Co se tady děje? První věc, kterou si všimnete, je to, že jsem přestěhoval linku založit() a do. t kreslit() metoda. Tím se zajistí, že skica bude opakovaně testovat, zda je nalezen Arduino; dělá test v založit() by to znamenalo, že se to stane pouze jednou, když začne skica. Dále jsem vytvořil volanou vlajku ardinoOK - pokud je tento příznak false, chceme se pokusit uchopit port a zobrazit chybové hlášení. Pokud je příznak true, pak chceme číst port a zobrazit hodnoty. Nakonec jsem vložil port = nové Serial (toto, arduinoPort, 9600); uvnitř bloku try-catch. Pokud příkaz uspěje, nastavíme arduinoOK pravdivé. Pokud dojde k výjimce, chytíme ji pomocí úlovek (výjimka e) a nastavit arduinoOK na false. Protože tento kód je uvnitř kreslit(), opakuje tuto logiku znovu a znovu. Voila!

Upozornění

Jak jsem již naznačil, zvládání výjimek pro tento projekt bylo trochu obtížné řešit. Například, Schodiště (čtenář, jehož komentář odstartoval tento post) hlásil ArrayIndexOutOfBoundsExeption. To znamenalo, že kód vyhodil Řetězec arduinoPort = Serial.list () [0]:, což znamená, že neexistovala žádná zařízení. „Ha,“ pomyslel jsem si, budu testovat na tuto výjimku. Když jsem ho ale provozoval na svém počítači Mac, našel jsem několik zařízení, která jsou již v seznamu. Pluggin v Arduinu pouze přidal dvě nové položky do seznamu, jak je uvedeno v následující tabulce.

Není nainstalován Arduino Arduino Instalován
Stabilní knihovna =============== Nativní verze lib = RXTX-2.1 -7 Java lib verze = RXTX-2.1-7 [0] "/dev/tty.Bluetooth-Modem" [1] "/dev/cu.Bluetooth-Modem" [2] "/dev/tty.Bluetooth-PDA- Sync "[3]" /dev/cu.Bluetooth-PDA-Sync " Stabilní knihovna =============== Nativní verze lib = RXTX-2.1 -7 Java lib verze = 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 "Experimentální: JNI_OnLoad volal.

Trochu Googlingu naznačovalo, že Mac mají několik procesů běžících ve výchozím nastavení, aby vyzvedly nová zařízení, jako jsou fotoaparáty nebo zařízení Bluetooth. Takže jsem si myslel, že schody musí být na PC, který tyto položky neměl.

Můj kód však stále fouká, ale pro jinou chybu: gnu.io.PortInUseException. „Ha !,“ I když to můžu chytit. Ale ani to nefungovalo. Googling kolem, jsem zjistil, že se zdá, že je divný chyba na OS X, která dělá chytání této výjimky problematické, a že budete muset přeinstalovat nebo odstranit různé části Serial knihovny, aby byly funkční. Tak to také nefungovalo. Konečně jsem se jen usadil na chytání toho nejobecnějšího Výjimka aby to fungovalo.

Pak jsem chtěl udělat něco více o tom, jak jste při spuštění skici zachytili chyby. Konkrétně jsem chtěl zvládnout případ, kdy je Arduino zapojen, skica začne běžet a odpojíte jej od proudu. Když jsem to ale vyzkoušela, dostala jsem tuto chybovou zprávu, která zřejmě pocházela z operačního systému:

Vzhledem k tomu, že se s ním v potravinovém řetězci manipulovalo výš, chyba se nikdy nevyskytovala jako výjimka ve Zpracování, takže náčrtek se vesele hučel. Hmmm, myslel jsem si. Trocha Googlingu odhalila, že je velmi špatné dělat to, co jsem plánovala, a že to může vést k nejrůznějším problémům. Takže, myslím, že Mac má zabudovaná bezpečnostní opatření, aby se předešlo problémům ve směru toku. Myslím, že bych měl být vděčný, ale mě to v tomto případě odrazilo.

To vše ukazuje, že to může být opravdu, opravdu těžké určit chyby programování, protože existuje tolik složitostí a vzájemných závislostí. Myslím, že to je pravděpodobně důvod, proč se tolik programátorů stává Tvůrci. V povolání, kde 6 měsíců může být věčnost, je uspokojující vědět, že stroje, které stavíte z převodů a pák, budou pravděpodobně pro Aristotela srozumitelné. Upřímně řečeno, je neuvěřitelné, že svět funguje tak hladce, jak to dělá.

Děkuji, obsluha výjimek všude!

V hale Maker:


Začínáme se zpracováním Naučte se programování počítače jednoduchým způsobem pomocí zpracování, což je jednoduchý jazyk, který umožňuje používat kód pro vytváření výkresů, animací a interaktivní grafiky. Kurzy programování obvykle začínají teorií, ale tato kniha vám umožňuje skočit přímo do kreativních a zábavných projektů. Je ideální pro každého, kdo se chce naučit základní programování a slouží jako jednoduchý úvod do grafiky pro lidi s některými programovacími dovednostmi.

Podíl

Zanechat Komentář