Megosztás a következőn keresztül:


21 Kivételek

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án throw: .
  • 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.
  • InnerExceptionA í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 a InnerException.) Ellenkező esetben az értéke azt nulljelzi, 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.

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, akkor System.TypeInitializationException a rendszer a statikus konstruktor meghívását kiváltó pontra dob. A belső kivétel az System.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.