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.
21.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.
21.2 Kivételek okai
A kivételek kétféleképpen adhatók meg.
- A
throw
nyilatkozat (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 21.5 .
Példa: Egy egész számosztási művelet (12.10.3. §) akkor ad vissza egy
System.DivideByZeroException
értéket, ha a nevező nulla. záró példa
21.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:
Message
egy írásvédett típusústring
tulajdonság, amely a kivétel okának ember által olvasható leírását tartalmazza.InnerException
A írásvédett tulajdonsága.Exception
Ha értéke nem,null
akkor 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 aztnull
jelzi, 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.Exception
intézett hívásokban adható meg.
21.4 A kivételek kezelése
A kivételeket utasítás try
(13.11. §) kezeli.
Kivétel esetén (21.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 try
utasítás kapcsolódó catch
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ő
catch
záradék keresése eléri a statikus konstruktort (15.12.§) vagy a statikus mező inicializálóját, akkorSystem.TypeInitializationException
a rendszer a statikus konstruktor meghívását kiváltó pontra dob. A belső kivétel azSystem.TypeInitializationException
eredetileg 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ő
catch
zá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.
21.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.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