Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se describe cómo usar un try-catch-finally
bloque para detectar una excepción.
Versión original del producto: Visual C++
Número de KB original: 815662
Resumen
Un try-catch-finally
bloque es un contenedor que se coloca alrededor de cualquier código donde pueda producirse una excepción. La captura y el tratamiento de excepciones son tareas de programación estándar.
Un try-catch-finally
bloque se compone de las secciones siguientes:
- Cualquier código que pueda producir una excepción se coloca dentro del bloque try.
- Si se produce una excepción, se escribe el
catch
bloque y el programa puede realizar la operación adecuada para recuperar o alertar al usuario. - El código del
finally
bloque siempre se ejecuta y puede limpiarse después de que se produzca una excepción. Elfinally
bloque es opcional.
En este artículo se hace referencia a los siguientes espacios de nombres de la biblioteca de clases de Microsoft .NET Framework: System.IO
y System.Security
.
Detectar excepciones en Visual C++ .NET
Inicie Visual Studio .NET.
En el menú Archivo, elija Nuevo y, a continuación, haga clic en Proyecto.
En Visual C++, haga clic en Visual C++ en Tipos de proyecto y, a continuación, haga clic en Aplicación de consola CLR en Plantillas.
En el cuadro Nombre , escriba Q815662 y, a continuación, haga clic en Aceptar.
Reemplace todo el código de la ventana de código de Q815662.cpp por el código siguiente. El código declara e inicializa tres variables. La inicialización de k produce un error.
#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. }
Pulse F5. Recibe una
System.DivideByZeroException
excepción.Ajuste una
try-catch
instrucción alrededor del código para capturar el error. El código siguiente detecta todos los errores que se producen en el código y muestra un mensaje de error genérico. Reemplace el código de la ventana de código Q815662.cpp por el código siguiente:#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."); } }
Presione CTRL+F5 para ejecutar la aplicación.
Nota:
Se muestra el mensaje de error del
catch
bloque en lugar del mensaje de error de excepción del sistema.Si debe limpiar o posprocesamiento independientemente de un error, use la
__finally
parte de latry-catch-finally
instrucción . El código de la parte finally de la instrucción siempre se ejecuta, independientemente de una excepción. El código siguiente muestra el siguiente mensaje en la consola, aunque no se haya producido ningún error:This statement is always printed.
Reemplace el código de la ventana de código Q815662.cpp por el código siguiente:
#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"); } }
Presione CTRL+F5 para ejecutar el proyecto.
Puede usar el objeto exception con la instrucción catch para recuperar detalles sobre la excepción. Un objeto de excepción tiene varias propiedades que pueden ayudarle a identificar el origen y tiene información de pila sobre una excepción. Esta información puede ser útil para ayudar a rastrear la causa original de la excepción o puede proporcionar una mejor explicación de su origen. El ejemplo siguiente detecta una excepción y proporciona un mensaje de error específico. Reemplace el código de la ventana de código Q815662.cpp por el código siguiente:
#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(); }
Hasta este momento, ha tratado con una excepción no específica. Sin embargo, si sabe de antemano qué tipo de excepción se va a producir, puede detectar la excepción esperada y procesarla en consecuencia. Use los varios bloques catch que se describen en el código siguiente para detectar todas las demás excepciones y tratar con ellas:
#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()); } }
Dado que las configuraciones de equipo pueden ser diferentes, el ejemplo de este paso puede producir o no una excepción. Si desea forzar una excepción de entrada/salida (E/S), cambie la ruta de acceso del archivo a una carpeta que no exista en el equipo.