Programujeme ve Visual Basic .NET - 4.díl - ošetření chyb

Visual Basic .NET - zkráceně VB.NET - je jedním z programovacích jazyků pro Microsoft .NET Framework. V tomto dílu se budeme věnovat způsobům, jakým ošetřovat chyby v programu pomocí konstrukce Try - Catch - End Try a seznámíme se se způsobem použití příkazu Imports.

Ošetření chyb, konstrukce Try - Catch - End Try

V této části se vrátíme k ukázce z předchozího dílu seriálu pro výpočet obvodu kružnice na základě zadané hodnoty poloměru podle vzorce obvod = 2 π ∙ polomer:

Module modMain
  Sub Main
    System.Console.WriteLine("Program pro výpočet obvodu kruhu na základě zadané hodnoty poloměru")
    System.Console.WriteLine()
    System.Console.WriteLine("Výpočet probíhá podle vzorce Obvod = 2 * pi * polomer")
    System.Console.WriteLine("Nyní prosím zadejte hodnotu poloměru [cm]")
    polomer = System.Console.ReadLine()
    System.Console.WriteLine("Obvod kruhu [cm]:")
    System.Console.WriteLine(2 * 3.1416 * polomer)
  End Sub
End Module

Ačkoliv naše aplikace s uživatelem komunikuje dobře, dříve či později při práci s programem narazíme na skutečnost, že zhavaruje v situaci, kdy uživatel při zadávání hodnoty poloměru buďto nezadá žádné číslo (místo zadání čísla prostě stiskne klávesu Enter), nebo zadá něco, co číslem ve skutečnosti není. K tomu může dojít velice snadno - například tak, že systémové nastavení počítače předpokládá, že desetinná místa jsou oddělována tečkou, zatímco uživatel předpokládá čárku (popř. obráceně). V tom případě se obvykle zobrazuje následující ošklivý systémový dialog se hlášením o kritické chybě, kterým nám prostředí .NET sděluje, že je v koncích a že si s naší aplikací neví rady.

Z vlastní uživatelské praxe jistě víte, že podobné kritické chyby nejsou tak docela vzácné a zpravidla jsou důsledkem nějakého opominutí programátora. V praxi je totiž vždy v duchu Murphyho zákonů počítat s tím, že uživatel dokáže s programem provést něco, s čím jsme původně nepočítali...

Za účelem předcházení podobných situací jazyk VB.NET nabízí několik možností. V následující části se seznámíme s konstrukciTry - Catch - End Try, což by se dalo z angličtiny přeložit jako "Zkus - Zachyť (chybu) - Konec pokusu". Použití konstrukce je velmi jednoduché: příkazy, nebo skupinu příkazů které mohou v programu způsobít chybu zapíšeme do bloku Try, do bloku Catch příkazy, kterými tuto chybu ošetříme. Těmito příkazy může být např. informace uživateli o chybě a návod, jakým způsobem jí předejít.

Try
    sem napíšeme příkaz(y)
, které mohou způsobit chybu
    ....
Catch
    sem napíšeme příkaz(y)
, které se provedou v případě, že dojde k chybě
    ....
End Try

Poznámky:

  • Uvedené schéma je jedna z nejjednodušších příkladů použítí konstrukceTry - Catch - End Try. Později se v rámci diskuse o tzv. strukturovaném zpracování aplikačních výjimek seznámíme se způsoby jakým v bloku Catch zjistit, k jaké chybě skutečně došlo a některými rozšířenými variantami použítí Try - Catch - End Try.
  • Popsaný způsob ošetřování chyb za běhu není jediný možný. VB.NET podporuje s ohledem na zpětnou kompatibilitu se staršími verzemi Visual Basicu také tzv. nestrukturované zpracování výjimek např. s využitím příkazu On Error GoTo - Resume Next. Vzhledem k tomu, že jde o zastaralé příkazy, který lze téměř vždy konstrukcíTry - Catch - End Try nahradit, jsou uvedeny pouze pro úplnost a nebudeme se jimi dále zabývat.
  • Prostředí .NET umožňuje ošetřit veškeré chyby vzniklé na globální úrovni v tzv. systémových událostech a přiřadit jim předem definované zpracování. Tímto způsobem lze ošetřit i jakékoliv zbývající nepředpokládané zdroje chyb, které nebyly zachyceny v bloku Try - Catch. Vzhledem k tomu, že jde o sice efektivní, avšak komplexní problematiku, nebudeme se jí v této části seriálu blíže věnovat,

Praktické použití konstrukce Try - Catch - End Try v naší ukázce je následující: Jelikož při nevhodně zadané hodnotě poloměru může dojít k chybě pouze při vlastním výpočtu obvodu kružnice, provedeme jej zvlášť v bloku Try a výslednou hodnotu uložíme do pomocné proměnné obvod. Tuto hodnotu následně vypíšeme do systémové konzole:

Try
  obvod = 2 * 3.1416 * polomer
  System.Console.WriteLine("Obvod kruhu [cm]:")
  System.Console.WriteLine(obvod)
Catch

Pokud výpočet obvodu selže (ať už z důvodu, že uživatel nezadal žádné číslo, nebo vstup, který VB.NET nedokáže na použitelné číslo převést), tuto situaci zachytíme v bloku Catch a dáme uživateli najevo, že došlo k nepředpokládané situaci - tzv. výjimce při běhu programu:

Catch
  System.Console.WriteLine("Byla zadána chybná hodnota polomeru")
End Try

Výsledný program se zahrnutím výše popsaného ošetření výjimky vypadá následovně: Všimněte si způsobu odsazování příkazů v bloku Try - Catch - End Try mezerami nebo tabulátorem. Ačkoliv prostředí VB.NET mezery na začátku i konci řádků ignoruje, správně použité odsazování může výrazně zlepšit čitelnost a přehlednost programu.

Module modMain
  Sub Main
    System.Console.WriteLine("Program pro výpočet obvodu kruhu na základě zadané hodnoty poloměru")
    System.Console.WriteLine()
    System.Console.WriteLine("Výpočet probíhá podle vzorce Obvod = 2 * pi * polomer")
    System.Console.WriteLine("Nyní prosím zadejte hodnotu poloměru [cm]")
    polomer = System.Console.ReadLine()
    Try
      obvod = 2 * 3.1416 * polomer
      System.Console.WriteLine("Obvod kruhu [cm]:")
      System.Console.WriteLine(obvod)
     Catch
      System.Console.WriteLine("Byla zadána chybná hodnota poloměru")
    End Try
  End Sub
End Module

Naše aplikace nyní funguje tak, že - pokud nezadáme použitelnou hodnotu poloměru, popř. jej nezadáme vůbec - program tuto skutečnost oznámí a ukončí se bez vypsání výsledku. Nyní již bude pro uživatele velmi obtížné náš program "shodit" zadáním nepoužitelné vstupní hodnoty. Později se seznámíme s možnostmi, jak chybně zadanou vstupní hodnotu zpracovat a ošetřit tak, aby uživatel získal možnost ji opravit znovu, popř. jak určitou hodnotu uživateli nabídnout jako výchozí (tzv. default).

Stručné shrnutí

Seznámili jsme se s důležitou oblastí programování - zpracování výjimek při běhu programu, ke kterým může dojít např. v důsledku chybně zadaných vstupních hodnot. Zpracování výjimek jsme si prakticky demonstrovali na příkladu použití konstrukce Try - Catch - End Try. V další části se seznámíme s dalšími řídícími strukturami VB.NET - logickými výrazy a příkazem podmínky If - Then.

Diskuze (19) Další článek: Nudíte se o víkendu? Ať vás baví internet! III.

Témata článku: , , , , , , , , , , , , , , , , , ,