Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
22.1 Általános
A C# kivételei strukturált, egységes és típusbiztos módot biztosítanak a rendszerszintű és az alkalmazásszintű hibafeltételek kezelésére.
22.2 Kivételek okai
A kivételek kétféleképpen adhatók meg.
- A
thrownyilatkozat (13.10.6. §) azonnal és feltétel nélkül kivételt képez. A vezérlő soha nem éri el az utasítást közvetlenül a következő utánthrow: . - A C# utasítások és kifejezések feldolgozása során felmerülő bizonyos kivételes feltételek kivételt okoznak bizonyos körülmények között, amikor a művelet nem hajtható végre rendesen. Az ilyen módon kivehető kivételek listáját lásd a 22.5 .
Példa: Egy egész számosztási művelet (12.12.3. §) akkor ad vissza egy
System.DivideByZeroExceptionértéket, ha a nevező nulla. záró példa
22.3 A System.Exception osztály
Az System.Exception osztály az összes kivétel alaptípusa. Ez az osztály néhány figyelemre méltó tulajdonsággal rendelkezik, amelyeket az összes kivétel megoszt:
-
Messageegy írásvédett típusústringtulajdonság, amely a kivétel okának ember által olvasható leírását tartalmazza. -
InnerExceptionA írásvédett tulajdonsága.ExceptionHa értéke nem,nullakkor az aktuális kivételt okozó kivételre hivatkozik. (Ez azt jelentette, hogy az aktuális kivételt egy fogási blokk emelte ki, amely aInnerException.) Ellenkező esetben az értéke aztnulljelzi, hogy ezt a kivételt nem egy másik kivétel okozta. Az ilyen módon összeláncolt kivételobjektumok száma tetszőleges lehet.
Ezeknek a tulajdonságoknak az értéke a példánykonstruktorhoz System.Exceptionintézett hívásokban adható meg.
22.4 A kivételek kezelése
A kivételeket utasítás try(13.11. §) kezeli.
Kivétel esetén (22.2.§) a rendszer megkeresi a legközelebbi fogási záradékot, amely képes kezelni a kivételt a kivétel futásidejű típusa alapján. Először az aktuális metódus lexikálisan beágyazó try utasítást keres, és az catch utasítás kapcsolódó try záradékai sorrendbe vannak véve. Ha ez nem sikerül, az aktuális metódust meghívó metódus egy lexikálisan beágyazó try utasítást keres, amely az aktuális metódus hívásának pontját tartalmazza. Ez a keresés addig folytatódik, amíg meg nem talál egy catch záradékot, amely képes kezelni az aktuális kivételt, ha a kivétel futásidejű típusának egy azonos vagy alaposztályú kivételosztályt nevez el. A catch kivételosztálynak nem nevező záradékok bármilyen kivételt kezelhetnek.
Miután megtalálta a megfelelő catch záradékot, a rendszer előkészíti az irányítást a záradék első utasítására catch . A záradék végrehajtása előtt a catch rendszer először végrehajtja sorrendben azokat a záradékokat, finally amelyek a kivételt észlelőnél beágyazottabb utasításokhoz try voltak társítva.
Ha nem található egyező catch záradék:
- Ha az egyező
catchzáradék keresése eléri a statikus konstruktort (15.12.§) vagy a statikus mező inicializálóját, akkorSystem.TypeInitializationExceptiona rendszer a statikus konstruktor meghívását kiváltó pontra dob. A belső kivétel azSystem.TypeInitializationExceptioneredetileg kidobott kivételt tartalmazza. - Ellenkező esetben, ha kivétel történik a véglegesítő végrehajtása során, és ez a kivétel nem fogott ki, akkor a viselkedés meghatározatlan.
- Ellenkező esetben, ha az egyező
catchzáradékok keresése eléri azt a kódot, amely kezdetben elindította a szálat, akkor a szál végrehajtása leáll. Az ilyen megszüntetés hatása implementációban van meghatározva.
22.5 Gyakori kivételosztályok
Bizonyos C#-műveletek a következő kivételeket vetik ki.
| Kivétel típusa | Leírás |
|---|---|
System.ArithmeticException |
Alaposztály az olyan kivételekhez, amelyek az aritmetikai műveletek során fordulnak elő, például System.DivideByZeroException és System.OverflowException. |
System.ArrayTypeMismatchException |
Akkor kerül sor, ha egy tároló egy tömbbe sikertelen, mert a tárolt elem típusa nem kompatibilis a tömb típusával. |
System.DivideByZeroException |
Akkor jelenik meg, ha egy integrálérték nullával való felosztására tett kísérlet történik. |
System.IndexOutOfRangeException |
Akkor kerül sor, ha egy tömb indexelése nullánál kisebb vagy a tömb határain kívül eső indexen keresztül történik. |
System.InvalidCastException |
Akkor fordul elő, ha egy alaptípusból vagy interfészből származtatott típusra való explicit átalakítás futásidőben meghiúsul. |
System.InvalidOperationException |
Akkor jelenik meg, ha egy metódushívás érvénytelen az objektum aktuális állapotához. |
System.NullReferenceException |
A hivatkozás olyan módon történő használata esetén null kerül eldobva, amely a hivatkozott objektum kötelező használatát eredményezi. |
System.OutOfMemoryException |
A memória (keresztüli new) lefoglalására tett kísérlet meghiúsul. |
System.OverflowException |
Akkor lesz bedobva, ha egy kontextusban lévő checked aritmetikai művelet túlcsordul. |
System.StackOverflowException |
A végrehajtási verem túl sok függőben lévő hívással lesz kimerítve; általában nagyon mély vagy kötetlen rekurzióra utal. |
System.TypeInitializationException |
Akkor jelenik meg, ha egy statikus konstruktor vagy statikus mező inicializáló kivételt jelez, és nincs catch olyan záradék, amely elkapja. |
ECMA C# draft specification