Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article explique comment utiliser un try-catch-finally
bloc pour intercepter une exception.
Version du produit d’origine : Visual C++
Numéro de base de connaissances d’origine : 815662
Résumé
Un try-catch-finally
bloc est un wrapper que vous placez autour de n’importe quel code où une exception peut se produire. L’interception et la gestion des exceptions sont des tâches de programmation standard.
Un try-catch-finally
bloc est constitué des sections suivantes :
- Tout code pouvant lever une exception est placé à l’intérieur du bloc try.
- Si une exception est levée, le
catch
bloc est entré et le programme peut effectuer l’opération appropriée pour récupérer ou alerter l’utilisateur. - Le code du
finally
bloc est toujours exécuté et peut effectuer un nettoyage après qu’une exception se produit. Lefinally
bloc est facultatif.
Cet article fait référence aux espaces de noms de bibliothèque de classes Microsoft .NET Framework suivants : System.IO
et System.Security
.
Intercepter les exceptions dans Visual C++ .NET
Démarrez Visual Studio .NET.
Dans le menu Fichier , pointez sur Nouveau, puis cliquez sur Projet.
Dans Visual C++, cliquez sur Visual C++ sous Types de projets, puis sur Application console CLR sous Modèles.
Dans la zone Nom , tapez Q815662, puis cliquez sur OK.
Remplacez tout le code dans la fenêtre de code Q815662.cpp par le code suivant. Le code déclare et initialise trois variables. L’initialisation de k provoque une erreur.
#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. }
Appuyez sur F5. Vous recevez une
System.DivideByZeroException
exception.Habillage d’une
try-catch
instruction autour de votre code pour capturer l’erreur. Le code suivant intercepte toutes les erreurs levées dans le code et affiche un message d’erreur générique. Remplacez le code dans la fenêtre de code Q815662.cpp par le code suivant :#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."); } }
Appuyez sur Ctrl+F5 pour exécuter l’application.
Note
Le message d’erreur du
catch
bloc s’affiche au lieu du message d’erreur d’exception système.Si vous devez effectuer un nettoyage ou un post-traitement, quelle que soit l’erreur, utilisez la
__finally
partie de l’instructiontry-catch-finally
. Le code de la dernière partie de l’instruction est toujours exécuté, quelle qu’en soit l’exception. Le code suivant affiche le message suivant dans la console, même si aucune erreur n’a eu lieu :This statement is always printed.
Remplacez le code dans la fenêtre de code Q815662.cpp par le code suivant :
#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"); } }
Appuyez sur CTRL+F5 pour exécuter le projet.
Vous pouvez utiliser l’objet d’exception avec l’instruction catch pour récupérer des détails sur l’exception. Un objet d’exception a un certain nombre de propriétés qui peuvent vous aider à identifier la source et qui contient des informations de pile sur une exception. Ces informations peuvent être utiles pour suivre la cause d’origine de l’exception ou fournir une meilleure explication de sa source. L’exemple suivant intercepte une exception et fournit un message d’erreur spécifique. Remplacez le code dans la fenêtre de code Q815662.cpp par le code suivant :
#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(); }
Jusqu’à ce stade, vous avez traité une exception non spécifique. Toutefois, si vous savez à l’avance quel type d’exception va se produire, vous pouvez intercepter l’exception attendue et la traiter en conséquence. Utilisez les plusieurs blocs catch décrits dans le code suivant pour intercepter toutes les autres exceptions et les gérer :
#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()); } }
Étant donné que les configurations d’ordinateur peuvent être différentes, l’exemple de cette étape peut ou ne pas lever d’exception. Si vous souhaitez forcer une exception d’entrée/sortie (E/S), remplacez le chemin d’accès au fichier par un dossier qui n’existe pas sur votre ordinateur.