Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original
Personas que lo han encontrado útil: 1 de 1 - Valorar este tema

Exception.Data (Propiedad)

Obtiene una colección de pares clave-valor que proporcionan información adicional definida por el usuario acerca de la excepción.

Espacio de nombres:  System
Ensamblado:  mscorlib (en mscorlib.dll)
public virtual IDictionary Data { get; }

Valor de propiedad

Tipo: System.Collections.IDictionary
Objeto que implementa la interfaz de System.Collections.IDictionary y contiene una colección de pares clave-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.

NotaNota

Las clases ExecutionEngineException, OutOfMemoryException, StackOverflowException y ThreadAbortException siempre devuelven null 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("\nException with some extra information...");
      RunTest(false);
      Console.WriteLine("\nException 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.Count > 0) {
            Console.WriteLine("  Extra details:");
            foreach (DictionaryEntry de in e.Data)
               Console.WriteLine("    Key: {0,-20}      Value: {1}", 
                                 "'" + de.Key.ToString() + "'", 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;
   }
}
// The example displays the following output: 
//    Exception with some extra information...
//    An exception was thrown.
//    This statement is the original exception message.
//      Extra details:                                               
//        Key: 'ExtraInfo'               Value: Information from NestedRoutine1.
//        Key: 'MoreExtraInfo'           Value: More information from NestedRoutine1.
//    
//    Exception with all extra information...
//    An exception was thrown.
//    This statement is the original exception message.
//      Extra details:
//        Key: 'stringInfo'              Value: Information from NestedRoutine2.
//        Key: 'IntInfo'                 Value: -903
//        Key: 'DateTimeInfo'            Value: 7/29/2013 10:50:13 AM
//        Key: 'ExtraInfo'               Value: Information from NestedRoutine1.
//        Key: 'MoreExtraInfo'           Value: More information from NestedRoutine1. 


.NET Framework

Compatible con: 4.5, 4, 3.5, 3.0, 2.0

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Biblioteca de clases portable

Compatible con: Biblioteca de clases portable

.NET para aplicaciones de la Tienda Windows

Compatible con: Windows 8

Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.
¿Te ha resultado útil?
(Caracteres restantes: 1500)
Gracias por sus comentarios

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft. Reservados todos los derechos.