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


Kivételek és kivételkezelés

A C# nyelv kivételkezelési funkciói segítenek kezelni a program futtatásakor előforduló váratlan vagy kivételes helyzeteket. A kivételkezelés a try, catchés finally a kulcsszavak használatával olyan műveleteket próbál ki, amelyek nem feltétlenül sikeresek, kezeli a hibákat, amikor úgy dönt, hogy ezt ésszerűnek ítéli, és ezt követően törli az erőforrásokat. A kivételeket a közös nyelvi futtatókörnyezet (CLR), a .NET- vagy külső kódtárak, illetve az alkalmazáskód generálhatja. A kivételek a throw kulcsszó használatával jönnek létre.

Sok esetben előfordulhat, hogy egy kivételt nem a kód által közvetlenül meghívott metódus, hanem egy másik metódus jelez a hívási veremben. Kivétel esetén a CLR feloldja a vermet, és egy metódust keres az adott kivételtípus blokkjával catch , és végrehajtja az első ilyen catch blokkot. Ha nem talál megfelelő catch blokkot a hívásveremben, leállítja a folyamatot, és üzenetet jelenít meg a felhasználónak.

Ebben a példában egy metódustesztet végzünk a nullával való osztáshoz, és elkapjuk a hibát. A kivételkezelés nélkül ez a program a DivideByZeroException nem kezelt hibával leállna.

public class ExceptionTest
{
    static double SafeDivision(double x, double y)
    {
        if (y == 0)
            throw new DivideByZeroException();
        return x / y;
    }

    public static void Main()
    {
        // Input for test purposes. Change the values to see
        // exception handling behavior.
        double a = 98, b = 0;
        double result;

        try
        {
            result = SafeDivision(a, b);
            Console.WriteLine("{0} divided by {1} = {2}", a, b, result);
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

Kivételek áttekintése

A kivételek a következő tulajdonságokkal rendelkeznek:

  • A kivételek olyan típusok, amelyekből végül az összes származik System.Exception.
  • Használjon blokkot try az olyan utasítások körül, amelyek kivételeket jelezhetnek.
  • Ha kivétel történik a try blokkban, a vezérlés folyamata az első társított kivételkezelőre ugrik, amely a hívási veremben bárhol jelen van. A C# nyelvben a catch kulcsszó egy kivételkezelő definiálására szolgál.
  • Ha egy adott kivételhez nem tartozik kivételkezelő, a program hibaüzenettel leáll.
  • Ne észlelje a kivételt, hacsak nem tudja kezelni, és nem hagyja ismert állapotban az alkalmazást. Ha elkapjaSystem.Exception, a blokk végén catch található kulcsszóval throw próbálkozzon újra.
  • Ha egy catch blokk kivételváltozót határoz meg, a használatával további információkat kaphat a bekövetkezett kivétel típusáról.
  • A kivételeket a program explicit módon generálhatja a throw kulcsszó használatával.
  • A kivételobjektumok részletes információkat tartalmaznak a hibáról, például a hívássorozat állapotát és a hiba szöveges leírását.
  • A blokkokban lévő finally kód végrehajtása attól függetlenül történik, hogy kivétel történik-e. Blokk használatával finally szabadíthat fel erőforrásokat, például bezárhatja a blokkban try megnyitott streameket vagy fájlokat.
  • A .NET-ben a felügyelt kivételek a Win32 strukturált kivételkezelési mechanizmusán alapulnak. További információ: Strukturált kivételkezelés (C/C++) és összeomlási kurzus a Win32 strukturált kivételkezelés mélységéről.

C# nyelvspecifikáció

További információ: Kivételek a C# nyelv specifikációjában. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.

Lásd még