Mivel minden végrehajtható kódrészlet, amely potenciálisan kivételt okozhat valamely osztály valamely metódusában van elhelyezve, ezért a keletkezhető kivételeket a függvények deklarációjánál kell megadni. Ennek szintaxisát tehát a függvény szintaxisának része:
láthatóság módosítók visszatérési_típus függvénynév(típus paraméternév (, típus paraméternév)*) [throw kivétel_típus (, kivétel_típus)*] [ { utasítások return kifejezés; } ](bővebben lásd az Alprogramok, modulok c. fejezetet)
Amikor olyan pontohz érünk a programban, amikor valamilyen kivételes esemény történt, és mi nem tudjuk
ezt lekezelni, ill. ezt a külvilág felé egyéb módon korrekten jelezni, akkor dobhatunk kivételt. Ezt a
throw kulcsóval tehetjük meg, ami a mögé írt kifejezés értékét fogja kivételként eldobni.
Ha valamely kódrészlet kivételt dobhat, és mi erre fel szeretnénk készülni, akkor az adott kódrészletet
egy úgynevezett try-catch-finally szrkezetbe tehetjük, ami révén ha kivétel váltódik ki, azt mi elkaphatjuk,
és ha tudjuk, megfelelően le is kezelhetjük a kivételes eseményt.
Szintaxisa:
try { ... } catch(kivétel_típus paraméter) { ... } ... catch(kivétel_típus paraméter) { ... } finally { ... }Ha a kivétel a catch ágban megadott típusú, akkor az az ág fog végrehalytódni. Csak egy ág hajtódik végre, és a típus vizsgálata fentről lefelé történik. Legvégül a finally ág mindig lefut, még akkor is, ha nem volt kiválasztható catch ág.
A kivétel a a hívási láncon visszafelé terjed, egészen addig, amíg valahol le el nem kapják. Ha egy kivételt egy catch ágban elkapunk, akkor a kivétel terjedése megáll. Amennyiben nem tudjuk teljesen lekezelni a kivételes eseményt, akkor továbbdobhatjuk az elkepott kivételt egy paraméter nélköli throw; utasítással. (A paraméter nélköli throw; utasítás csak catch ágban használható.) Vagy akár egy teljesen más kivételt dobhatunk helyette.
A J# két típusú hibaüzentet generál: Java-s és .Net-s kivételeket.
Kivétel | Leírás |
---|---|
Ellenőrzött | Ha egy metódus eredményként egy ellenőrzött kivételt dob, a fordító hibát fog jelezni, hacsak a kód ahonnan a metódust hívjuk nincs try-catch blokkban. |
Futási idejű | A java.lang.RuntimeException osztályból származik. A fordító nem kötelezi, hogy legyen catch blokk a hívó kódban |
A J# 2005 hozott néhány változást ezen a téren. Régebben nem tartalmazhatott egy catch all exceptions-t
egy egyszerű catch szakasz, ami normális esetben lehetséges a Java-ban egy
java.lang.Throwable elkapásával. A .NET Framework előző verzóiban nem volt lehetséges
elkapni egy ilyen java.lang.Throwable-t, de a változtatások a fordítóban már lehetővé
teszik ezt egy szimpla catch szakaszban. Szintén lehetséges .NET-es kivételeket elkapni
egy tagolt catch szakaszban.
A következő példák bemutatják a kivételkezelés különféle módjait, és a hozáájuk tartozó viselkedéseket.