Exception.Data (Propiedad)
Ensamblado: mscorlib (en mscorlib.dll)
/** @property */ public IDictionary get_Data ()
public function get Data () : IDictionary
Valor de propiedad
Objeto que implementa la interfaz de System.Collections.IDictionary y contiene una colección de pares de clave y valor definidos por el usuario. El valor predeterminado es una colección vacía.Hay que utilizar el objeto System.Collections.IDictionary devuelto por la propiedad Data para almacenar y recuperar información adicional de interés para la excepción. La información tiene la forma de un número arbitrario de pares de clave y valor definidos por el usuario. El componente de clave de cada par de clave y valor suele ser una cadena de identificación, en tanto que el componente de valor del par puede ser cualquier tipo de objeto.
Seguridad del par de clave y valor
Los pares de clave y valor almacenados en la colección devuelta por la propiedad Data no son seguros. Si la aplicación llama a una serie de rutinas anidadas y cada rutina contiene controladores de excepciones, la pila de llamadas resultante contiene una jerarquía de esos controladores de excepciones. Si una rutina de nivel inferior produce una excepción, un controlador de excepciones de nivel superior en la jerarquía de pila de llamadas puede leer y modificar los pares de clave y valor que cualquier otro controlador de excepciones haya almacenado en la colección. Esto significa que se debe garantizar que la información de los pares de clave y valor no es confidencial y que la aplicación funcionará correctamente si la información de los pares de clave y valor se dañara.
Conflictos de clave
Se produce un conflicto de clave cuando controladores de excepciones distintos especifican la misma clave para obtener acceso a un par de clave y valor. Se debe ser cauteloso a la hora de desarrollar la aplicación, porque la consecuencia de un conflicto de claves puede ser que los controladores de excepciones de nivel inferior se comuniquen inadvertidamente con controladores de excepciones de nivel superior. Esta comunicación podría provocar errores de programa imperceptibles. No obstante, si se toman precauciones, los conflictos de clave se pueden utilizar para mejorar la aplicación.
Evitar conflictos de clave
Para evitar conflictos de clave hay que adoptar una convención de denominación a fin de generar claves únicas para los pares de clave y valor. Por ejemplo, una convención de denominación podría ser una clave que conste del nombre de la aplicación delimitado por puntos, el método que proporciona información adicional del par y un identificador único.
Supongamos que existen dos aplicaciones, denominadas Productos y Proveedores, cada una de las cuales tiene un método denominado Ventas. El método Ventas de la aplicación Productos proporciona el número de identificación (número de referencia de almacén o SKU) de un producto. El método Ventas de la aplicación de proveedores proporciona el número de identificación, o SID, de un proveedor. En consecuencia, la convención de denominación para este ejemplo produce las claves "Productos.Ventas.SKU" y "Proveedores.Ventas.SID".
Aprovechamiento de los conflictos de clave
Para aprovechar los conflictos de clave se utiliza la presencia de una o más claves especiales organizadas previamente con el fin de controlar el proceso. Supongamos, en un caso, que el nivel más alto de controlador de excepciones en la jerarquía de pila de llamadas detecta todas las excepciones producidas por controladores de excepciones de nivel inferior. Si existe un par de clave y valor con una clave especial, el controlador de excepciones de nivel superior dará formato al resto de pares de clave y valor del objeto IDictionary de algún modo no estándar; de lo contrario, se dará formato al resto de los pares de clave y valor de alguna manera normal.
Ahora supongamos, en otro caso, que el controlador de excepciones en cada nivel de la jerarquía de pila de llamadas detecta la excepción producida por el controlador de excepciones del siguiente nivel inferior. Además, cada controlador de excepciones sabe que la colección devuelta por la propiedad Data contiene un conjunto de pares de clave y valor al que se puede obtener acceso con un conjunto de claves organizado previamente.
Cada controlador de excepciones utiliza el conjunto de claves previamente organizado para actualizar el componente de valor del par de clave y valor correspondiente con información única para ese controlador de excepciones. Una vez completado el proceso de actualización, el controlador de excepciones produce la excepción en el controlador de excepciones del siguiente nivel superior. Finalmente, el controlador de excepciones del nivel superior obtiene acceso a los pares de clave y valor y muestra la información de actualización consolidada de todos los controladores de excepciones de nivel inferior.
Nota |
|---|
| Las clases ExecutionEngineException, OutOfMemoryException, StackOverflowException y ThreadAbortException siempre devuelven referencia de objeto null (Nothing en Visual Basic) para el valor de la propiedad Data. |
En el ejemplo siguiente se muestra cómo agregar y recuperar información mediante la propiedad Data.
// This example demonstrates the Exception.Data property. using System; using System.Collections; class Sample { public static void Main() { Console.WriteLine(); Console.WriteLine("Exception with some extra information..."); RunTest(false); Console.WriteLine(); Console.WriteLine("Exception with all extra information..."); RunTest(true); } public static void RunTest(bool displayDetails) { try { NestedRoutine1(displayDetails); } catch (Exception e) { Console.WriteLine("An exception was thrown."); Console.WriteLine(e.Message); if (e.Data != null) { Console.WriteLine(" Extra details:"); foreach (DictionaryEntry de in e.Data) Console.WriteLine(" The key is '{0}' and the value is: {1}", de.Key, de.Value); } } } public static void NestedRoutine1(bool displayDetails) { try { NestedRoutine2(displayDetails); } catch (Exception e) { e.Data["ExtraInfo"] = "Information from NestedRoutine1."; e.Data.Add("MoreExtraInfo", "More information from NestedRoutine1."); throw e; } } public static void NestedRoutine2(bool displayDetails) { Exception e = new Exception("This statement is the original exception message."); if (displayDetails) { string s = "Information from NestedRoutine2."; int i = -903; DateTime dt = DateTime.Now; e.Data.Add("stringInfo", s); e.Data["IntInfo"] = i; e.Data["DateTimeInfo"] = dt; } throw e; } } /* This example produces the following results: Exception with some extra information... An exception was thrown. This statement is the original exception message. Extra details: The key is 'ExtraInfo' and the value is: Information from NestedRoutine1. The key is 'MoreExtraInfo' and the value is: More information from NestedRoutine1. Exception with all extra information... An exception was thrown. This statement is the original exception message. Extra details: The key is 'stringInfo' and the value is: Information from NestedRoutine2. The key is 'IntInfo' and the value is: -903 The key is 'DateTimeInfo' and the value is: 11/26/2002 2:12:58 PM The key is 'ExtraInfo' and the value is: Information from NestedRoutine1. The key is 'MoreExtraInfo' and the value is: More information from NestedRoutine1. */
// This example demonstrates the Exception.Data property.
import System.*;
import System.Collections.*;
class Sample
{
public static void main(String[] args)
{
Console.WriteLine();
Console.WriteLine("Exception with some extra information...");
RunTest(false);
Console.WriteLine();
Console.WriteLine("Exception with all extra information...");
RunTest(true);
} //main
public static void RunTest(boolean displayDetails)
{
try {
NestedRoutine1(displayDetails);
}
catch (System.Exception e) {
Console.WriteLine("An exception was thrown.");
Console.WriteLine(e.get_Message());
if (e.get_Data() != null) {
Console.WriteLine(" Extra details:");
DictionaryEntry de;
IEnumerator enumObj = e.get_Data().GetEnumerator();
while (enumObj.MoveNext()) {
de = (DictionaryEntry)enumObj.get_Current();
Console.WriteLine(" The key is '{0}' and the value "
+ "is: {1}", de.get_Key(), de.get_Value());
}
}
}
} //RunTest
public static void NestedRoutine1(boolean displayDetails)
throws System.Exception
{
try {
NestedRoutine2(displayDetails);
}
catch (System.Exception e) {
e.get_Data().set_Item("ExtraInfo",
"Information from NestedRoutine1.");
e.get_Data().Add("MoreExtraInfo",
"More information from NestedRoutine1.");
throw e;
}
} //NestedRoutine1
public static void NestedRoutine2(boolean displayDetails)
throws System.Exception
{
System.Exception e = new Exception("This statement is the original "
+ "exception message.");
if (displayDetails) {
String s = "Information from NestedRoutine2.";
int i = -903;
DateTime dt = DateTime.get_Now();
e.get_Data().Add("stringInfo", s);
e.get_Data().set_Item("IntInfo", (Int32)i);
e.get_Data().set_Item("DateTimeInfo", dt);
}
throw e;
} //NestedRoutine2
} //Sample
/*
This example produces the following results:
Exception with some extra information...
An exception was thrown.
This statement is the original exception message.
Extra details:
The key is 'ExtraInfo' and the value is: Information from NestedRoutine1.
The key is 'MoreExtraInfo' and the value is: More information from
NestedRoutine1.
Exception with all extra information...
An exception was thrown.
This statement is the original exception message.
Extra details:
The key is 'stringInfo' and the value is: Information from NestedRoutine2.
The key is 'IntInfo' and the value is: -903
The key is 'DateTimeInfo' and the value is: 11/26/2002 2:12:58 PM
The key is 'ExtraInfo' and the value is: Information from NestedRoutine1.
The key is 'MoreExtraInfo' and the value is: More information from
NestedRoutine1.
*/
Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter Edition
.NET Framework no admite todas las versiones de cada plataforma. Para obtener una lista de las versiones admitidas, vea Requisitos del sistema.
Nota