Freigeben über


Abfangen von Ausnahmen in Visual C++

In diesem Artikel wird beschrieben, wie Sie einen try-catch-finally Block verwenden, um eine Ausnahme abzufangen.

Originalproduktversion: Visual C++
Ursprüngliche KB-Nummer: 815662

Zusammenfassung

Ein try-catch-finally Block ist ein Wrapper, den Sie um beliebigen Code herumsetzen, in dem eine Ausnahme auftreten kann. Das Abfangen und Behandeln von Ausnahmen sind Standardprogrammierungsaufgaben.

Ein try-catch-finally Block besteht aus den folgenden Abschnitten:

  • Jeder Code, der eine Ausnahme auslösen kann, wird innerhalb des Try-Blocks platziert.
  • Wenn eine Ausnahme ausgelöst wird, wird der catch Block eingegeben, und das Programm kann den entsprechenden Vorgang ausführen, um den Benutzer wiederherzustellen oder zu benachrichtigen.
  • Der Code im finally Block wird immer ausgeführt und kann nach auftreten einer Ausnahme bereinigt werden. Der finally Block ist optional.

Dieser Artikel bezieht sich auf die folgenden Namespaces der Microsoft .NET Framework-Klassenbibliothek: System.IO und System.Security.

Abfangen von Ausnahmen in Visual C++ .NET

  1. Starten Sie Visual Studio .NET.

  2. Zeigen Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt.

  3. Klicken Sie in Visual C++ unter Projekttypen auf Visual C++, und klicken Sie dann unter "Vorlagen" auf "CLR-Konsolenanwendung".

  4. Geben Sie im Feld "Name" Q815662 ein, und klicken Sie dann auf "OK".

  5. Ersetzen Sie den gesamten Code im Q815662.cpp Codefenster durch den folgenden Code. Der Code deklariert und initialisiert drei Variablen. Die Initialisierung von k verursacht einen Fehler.

    #include "stdafx.h"
    #using <mscorlib.dll>
    #include <tchar.h>
    using namespace System;
    void _tmain(void)
    {
        Console::WriteLine("We're going to divide 10 by 0 and see what happens...");
        Console::WriteLine();
        int i = 10;
        int j = 0;
        int k = i/j; //Error on this line.
    }
    
  6. Drücken Sie F5. Sie erhalten eine System.DivideByZeroException Ausnahme.

  7. Umschließen Sie eine try-catch Anweisung um Ihren Code, um den Fehler zu erfassen. Der folgende Code erfasst alle Fehler, die im Code ausgelöst werden, und zeigt eine generische Fehlermeldung an. Ersetzen Sie den Code im codefenster Q815662.cpp durch den folgenden Code:

    #include "stdafx.h"
    #using <mscorlib.dll>
    #include <tchar.h>
    using namespace System;
    void _tmain(void)
    {
        try
        {
            Console::WriteLine("We're going to divide 10 by 0 and see what happens...");
            Console::WriteLine();
            int i = 10;
            int j = 0;
            int k = i/j; //Error on this line.
        }
        catch(...)
        {
            Console::WriteLine("An error occurred.");
        }
    }
    
  8. Drücken Sie STRG+F5, um die Anwendung auszuführen.

    Notiz

    Die Fehlermeldung aus dem catch Block wird anstelle der Systemausnahmefehlermeldung angezeigt.

  9. Wenn Sie unabhängig von einem Fehler eine Bereinigung oder Nachbearbeitung durchführen müssen, verwenden Sie den __finally Teil der try-catch-finally Anweisung. Der Code im letzten Teil der Anweisung wird unabhängig von einer Ausnahme immer ausgeführt. Der folgende Code zeigt die folgende Meldung in der Konsole an, auch wenn kein Fehler aufgetreten ist:

    This statement is always printed.  
    

    Ersetzen Sie den Code im codefenster Q815662.cpp durch den folgenden Code:

    #include "stdafx.h"
    #using <mscorlib.dll>
    #include <tchar.h>
    using namespace System;
    void _tmain(void)
    {
        try
        {
            Console::WriteLine("We're going to divide 10 by 0 and see what happens...");
            Console::WriteLine();
            int i = 10;
            int j = 0;
            int k = i/j; //Error on this line.
        }
        catch(...)
        {
            Console::WriteLine("An error occurred.");
        }
        __finally //This section is performed regardless of the above processing.
        {
            Console::WriteLine();
            Console::WriteLine("This statement is always printed");
        }
    }
    
  10. Drücken Sie STRG+F5, um das Projekt auszuführen.

  11. Sie können das Ausnahmeobjekt mit der Catch-Anweisung verwenden, um Details zur Ausnahme abzurufen. Ein Ausnahmeobjekt verfügt über eine Reihe von Eigenschaften, die Ihnen helfen können, die Quelle zu identifizieren, und verfügt über Stapelinformationen zu einer Ausnahme. Diese Informationen können hilfreich sein, um die ursprüngliche Ursache der Ausnahme nachzuverfolgen oder eine bessere Erläuterung ihrer Quelle bereitzustellen. Im folgenden Beispiel wird eine Ausnahme erfasst und eine bestimmte Fehlermeldung angezeigt. Ersetzen Sie den Code im codefenster Q815662.cpp durch den folgenden Code:

    #include "stdafx.h"
    #using <mscorlib.dll>
    #include <tchar.h>
    using namespace System;
    using namespace System::Reflection;
    void _tmain(void)
    {
        try
        {
            Console::WriteLine("We're going to divide 10 by 0 and see what happens...");
            Console::WriteLine();
            int i = 10;
            int j = 0;
            int k = i/j; //Error on this line.
        }
        catch(Exception *e)
        {
            Console::WriteLine("An error occurred.");
            Console::WriteLine(e->Message); // Print the error message.
            Console::WriteLine(e->StackTrace); //String that contains the stack trace for this exception.
        }
        __finally //This section is performed regardless of the above processing.
        {
            Console::WriteLine();
            Console::WriteLine("This statement is always printed");
        }
        Console::ReadLine();
    }
    
  12. Bis zu diesem Punkt haben Sie eine nicht spezifische Ausnahme behandelt. Wenn Sie jedoch im Voraus wissen, welche Art von Ausnahme eintritt, können Sie die erwartete Ausnahme abfangen und entsprechend verarbeiten. Verwenden Sie die im folgenden Code beschriebenen mehrere Catch-Blöcke, um alle anderen Ausnahmen abzufangen und damit zu umgehen:

    #include "stdafx.h"
    #using <mscorlib.dll>
    #include <tchar.h>
    using namespace System;
    using namespace System::IO;
    using namespace System::Security;
    void _tmain(void)
    {
        try
        {
            File::Create("c:\\temp\\testapp.txt"); //Can fail for a number of resons
        }
        // This error may occur if the temp folder does not exist.
        catch(IOException *ioe)
        {
            Console::WriteLine("An IOException exception occurred!");
            Console::WriteLine(ioe->ToString());
        }
        // You do not have the appropriate permission to take this action.
        catch(SecurityException *se)
        {
            Console::WriteLine("An SecurityException exception occur")
        }
        // Catch all exceptions
        catch(Exception *e)
        {
            Console::WriteLine(e->ToString());
        }
    }
    

    Da Computerkonfigurationen möglicherweise unterschiedlich sind, kann das Beispiel in diesem Schritt eine Ausnahme auslösen. Wenn Sie eine Eingabe-/Ausgabeausnahme erzwingen möchten, ändern Sie den Dateipfad in einen Ordner, der auf Ihrem Computer nicht vorhanden ist.