Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Clase FormatException

 

Publicado: octubre de 2016

Excepción que se produce cuando el formato de un argumento no es válido o cuando una cadena de formato compuesto no tiene el formato correcto.

Espacio de nombres:   System
Ensamblado:  mscorlib (en mscorlib.dll)

System.Object
  System.Exception
    System.SystemException
      System.FormatException
        System.IO.FileFormatException
        System.Net.CookieException
        System.Reflection.CustomAttributeFormatException
        System.UriFormatException

[SerializableAttribute]
[ComVisibleAttribute(true)]
public class FormatException : SystemException

NombreDescripción
System_CAPS_pubmethodFormatException()

Inicializa una nueva instancia de la clase FormatException.

System_CAPS_protmethodFormatException(SerializationInfo, StreamingContext)

Inicializa una nueva instancia de la clase FormatException con datos serializados.

System_CAPS_pubmethodFormatException(String)

Inicializa una nueva instancia de la clase FormatException con el mensaje de error especificado.

System_CAPS_pubmethodFormatException(String, Exception)

Inicializa una nueva instancia de la clase FormatException con el mensaje de error especificado y una referencia a la excepción interna que representa la causa de esta excepción.

NombreDescripción
System_CAPS_pubpropertyData

Obtiene una colección de pares clave-valor que proporcionan más información definida por el usuario sobre la excepción.(Heredado de Exception).

System_CAPS_pubpropertyHelpLink

Obtiene o establece un vínculo al archivo de ayuda asociado a esta excepción.(Heredado de Exception).

System_CAPS_pubpropertyHResult

Obtiene o establece HRESULT, un valor numérico codificado que se asigna a una excepción específica.(Heredado de Exception).

System_CAPS_pubpropertyInnerException

Obtiene la instancia Exception que produjo la excepción actual.(Heredado de Exception).

System_CAPS_pubpropertyMessage

Obtiene un mensaje que describe la excepción actual.(Heredado de Exception).

System_CAPS_pubpropertySource

Devuelve o establece el nombre de la aplicación o del objeto que generó el error.(Heredado de Exception).

System_CAPS_pubpropertyStackTrace

Obtiene una representación de cadena de los marcos inmediatos en la pila de llamadas.(Heredado de Exception).

System_CAPS_pubpropertyTargetSite

Obtiene el método que produjo la excepción actual.(Heredado de Exception).

NombreDescripción
System_CAPS_pubmethodEquals(Object)

Determina si el objeto especificado es igual al objeto actual.(Heredado de Object).

System_CAPS_protmethodFinalize()

Permite que un objeto intente liberar recursos y realizar otras operaciones de limpieza antes de ser reclamado por el recolector de basura. (Heredado de Object).

System_CAPS_pubmethodGetBaseException()

Cuando se invalida en una clase derivada, devuelve la clase Exception que representa la causa principal de una o más excepciones posteriores.(Heredado de Exception).

System_CAPS_pubmethodGetHashCode()

Sirve como la función hash predeterminada.(Heredado de Object).

System_CAPS_pubmethodGetObjectData(SerializationInfo, StreamingContext)

Cuando se invalida en una clase derivada, establece SerializationInfo con información sobre la excepción.(Heredado de Exception).

System_CAPS_pubmethodGetType()

Obtiene el tipo en tiempo de ejecución de la instancia actual.(Heredado de Exception).

System_CAPS_protmethodMemberwiseClone()

Crea una copia superficial del Object actual.(Heredado de Object).

System_CAPS_pubmethodToString()

Crea y devuelve una representación de cadena de la excepción actual.(Heredado de Exception).

NombreDescripción
System_CAPS_proteventSerializeObjectState

Ocurre cuando una excepción se serializa para crear un objeto de estado de excepción que contenga datos serializados sobre la excepción.(Heredado de Exception).

Un FormatException se puede producir la excepción de uno de los siguientes motivos:

  • En una llamada a un método que convierte una cadena en algún otro tipo de datos, la cadena no se ajusta al patrón requerido. Esto suele ocurrir cuando se llama a algunos métodos de la Convert clase y Parse y ParseExact métodos de algunos tipos.

    En la mayoría de los casos, especialmente si la cadena que se va a convertir es la entrada de un usuario o leer desde un archivo, debe usar un try/catch Bloquear y controlar la FormatException excepción si la conversión se realiza correctamente. También puede reemplazar la llamada al método de conversión con una llamada a un TryParse o TryParseExact (método), si existe alguno. Sin embargo, un FormatException excepción que se produce cuando se intenta analizar una cadena predefinida o codificado de forma rígida indica un error de programa. En este caso, se debe corregir el error en lugar de controlar la excepción.

    La conversión de una cadena en los siguientes tipos en el System espacio de nombres puede producir un FormatException excepción:

    • Boolean. El Boolean.Parse(String) y Convert.ToBoolean(String) métodos requieren la cadena que se puede convertir para ser "True", "true", "False" o "false". Cualquier otro valor produce un FormatException excepción.

    • DateTime y DateTimeOffset. Todos los datos de fecha y hora se interpreta basándose en las convenciones de formato de una referencia cultural concreta: la cultura del subproceso actual (o, en algunos casos, la referencia cultural actual dominio de aplicación), la referencia cultural invariable, o una referencia cultural especificada. Cuando se llama a la DateTime.ParseExact(String, String, IFormatProvider, DateTimeStyles) y DateTimeOffset.ParseExact(String, String[], IFormatProvider, DateTimeStyles) métodos, los datos de fecha y hora deben también ajustarse exactamente a un modelo especificado por una o más cadenas de formato estándar o cadenas de formato personalizado que se proporcionan como argumentos en la llamada al método. Si no cumple con un patrón específico de la referencia cultural esperado, un FormatException excepción. Esto significa que los datos de fecha y hora guardados en un formato específico de la referencia cultural en un sistema no pueden analizar correctamente en otro sistema.

      Para obtener más información acerca de cómo analizar fechas y horas, vea Analizar cadenas de fecha y hora en .NET Framework y la documentación para el método que produjo la excepción.

    • GUID. La representación de cadena de GUID debe consistir en 32 dígitos hexadecimales (0-F) y debe estar en uno de los resultados de cinco formatos por la Guid.ToString (método). Para obtener más información, vea el método Guid.Parse.

    • Tipos numéricos, incluidos todos los enteros, enteros sin signo y tipos de punto flotante. La cadena que se va a analizar debe contener los dígitos latinos 0-9. Símbolo de moneda, separador de decimales, separadores de grupos y un signo positivo o negativo pueden estar permitidos. Intenta analizar una cadena que contiene cualquier otro carácter siempre produce una FormatException excepción.

      Todas las cadenas numéricas se interpretan según las convenciones de formato de una referencia cultural concreta: la cultura del subproceso actual (o, en algunos casos, la referencia cultural actual dominio de aplicación), la referencia cultural invariable, o una referencia cultural especificada. Como resultado, una cadena numérica que se analiza usando las convenciones de una referencia cultural puede producir al usar las convenciones de otra.

      Para obtener más información acerca de cómo analizar cadenas numéricas, consulte Analizar cadenas numéricas en .NET Framework y la documentación para el método específico que produjo la excepción.

    • Intervalos de tiempo. Debe ser la cadena que se va a analizar en formato de la referencia cultural fijo o en un formato de la referencia cultural definida por la referencia cultural del subproceso actual (o, en algunos casos, la referencia cultural actual dominio de aplicación), la referencia cultural invariable, o una referencia cultural especificada. Si la cadena no está en un formato adecuado, o si, en el mínimo, días, horas, y los componentes de minutos del intervalo de tiempo no están presentes, el método de análisis produce un FormatException excepción. Para obtener más información, consulte la documentación de la TimeSpan al analizar el método que produjo la excepción.

  • Un tipo implementa el IFormattable interfaz, que admite las cadenas de formato que definen cómo se convierte un objeto en su representación de cadena y se utiliza una cadena de formato no válido. Esto es muy habitual en una operación de formato. En el ejemplo siguiente, se utiliza la cadena de formato estándar "T" en una cadena de formato compuesto para dar formato a un número. Sin embargo, no es válido "Q" cadena de formato estándar.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          decimal price = 169.32m;
          Console.WriteLine("The cost is {0:Q2}.", price);
       }
    }
    // The example displays the following output:
    //    Unhandled Exception: System.FormatException: Format specifier was invalid.
    //       at System.Number.FormatDecimal(Decimal value, String format, NumberFormatInfo info)
    //       at System.Decimal.ToString(String format, IFormatProvider provider)
    //       at System.Text.StringBuilder.AppendFormat(IFormatProvider provider, String format, Object[] args)
    //       at System.IO.TextWriter.WriteLine(String format, Object arg0)
    //       at System.IO.TextWriter.SyncTextWriter.WriteLine(String format, Object arg0)
    //       at Example.Main()
    

    Esta excepción deriva de un error de codificación. Para corregir el error, quite la cadena de formato o sustituir uno válido. En el ejemplo siguiente se corrige el error, reemplace la cadena de formato no válido con la cadena de formato "C" (divisa).

    using System;
    
    public class Example
    {
       public static void Main()
       {
          decimal price = 169.32m;
          Console.WriteLine("The cost is {0:C2}.", price);
       }
    }
    // The example displays the following output:
    //    The cost is $169.32.
    

    Un FormatException también se puede producir excepción mediante el análisis de métodos, como DateTime.ParseExact y Guid.ParseExact, que requieren la cadena que se analiza para ajustarse exactamente con el modelo especificado por una cadena de formato. En el ejemplo siguiente, se espera que la representación de cadena de un GUID se ajustan al modelo especificado por la cadena de formato estándar "G". Sin embargo, la Guid implementación de la estructura de IFormattable no es compatible con la cadena de formato "G".

    using System;
    
    public class Example
    {
       public static void Main()
       {
          string guidString = "ba748d5c-ae5f-4cca-84e5-1ac5291c38cb";
          Console.WriteLine(Guid.ParseExact(guidString, "G"));
       }
    }
    // The example displays the following output:
    //    Unhandled Exception: System.FormatException: 
    //       Format String can be only "D", "d", "N", "n", "P", "p", "B", "b", "X" or "x".
    //       at System.Guid.ParseExact(String input, String format)
    //       at Example.Main()
    

    Esta excepción también se produce de un error de codificación. Para corregirlo, llamar a un método de análisis que no requiere un formato preciso, como DateTime.Parse o Guid.Parse, o sustituir una cadena de formato válida. En el ejemplo siguiente se corrige el error llamando a la Guid.Parse (método).

    using System;
    
    public class Example
    {
       public static void Main()
       {
          string guidString = "ba748d5c-ae5f-4cca-84e5-1ac5291c38cb";
          Console.WriteLine(Guid.Parse(guidString));
       }
    }
    // The example displays the following output:
    //    ba748d5c-ae5f-4cca-84e5-1ac5291c38cb
    
  • Uno o varios de los índices de los elementos de formato de un cadena de formato compuesto es mayor que los índices de los elementos de la matriz de objetos de parámetro o de la lista. En el ejemplo siguiente, el índice más grande de un elemento de formato en la cadena de formato es 3. Dado que los índices de los elementos de la lista de objetos están basadas en cero, esta cadena de formato requeriría la lista de objetos tienen cuatro elementos. En su lugar, tiene solo tres, dat, temp, y scale, por lo que el código produce un FormatException excepción en tiempo de ejecución:.

    using System;
    
    public class Example
    {
       public enum TemperatureScale 
       { Celsius, Fahrenheit, Kelvin }
    
       public static void Main()
       {
          String info = GetCurrentTemperature();
          Console.WriteLine(info);
       }
    
       private static String GetCurrentTemperature()
       {
          DateTime dat = DateTime.Now;
          Decimal temp = 20.6m;
          TemperatureScale scale = TemperatureScale.Celsius;
          String result;
    
          result = String.Format("At {0:t} on {1:D}, the temperature is {2:F1} {3:G}",
                                 dat, temp, scale);    
          return result;
       }
    }
    // The example displays output like the following:
    //    Unhandled Exception: System.FormatException: Format specifier was invalid.
    //       at System.Number.FormatDecimal(Decimal value, String format, NumberFormatInfo info)
    //       at System.Decimal.ToString(String format, IFormatProvider provider)
    //       at System.Text.StringBuilder.AppendFormat(IFormatProvider provider, String format, Object[] args)
    //       at System.String.Format(IFormatProvider provider, String format, Object[] args)
    //       at Example.Main()
    

    En este caso, el FormatException excepción es el resultado de error de desarrollador. Se debe corregir en lugar de controlar en un try/catch bloque asegurándose de que cada elemento de la lista de objetos se corresponde con el índice de un elemento de formato. Para corregir este ejemplo, cambiar el índice del segundo elemento de formato para hacer referencia a la dat variable y disminuir el índice de cada elemento de formato posteriores en uno.

    using System;
    
    public class Example
    {
       public enum TemperatureScale 
       { Celsius, Fahrenheit, Kelvin }
    
       public static void Main()
       {
          String info = GetCurrentTemperature();
          Console.WriteLine(info);
       }
    
       private static String GetCurrentTemperature()
       {
          DateTime dat = DateTime.Now;
          Decimal temp = 20.6m;
          TemperatureScale scale = TemperatureScale.Celsius;
          String result;
    
          result = String.Format("At {0:t} on {0:D}, the temperature is {1:F1} {2:G}",
                                 dat, temp, scale);    
          return result;
       }
    }
    // The example displays output like the following:
    //    At 10:40 AM on Wednesday, June 04, 2014, the temperature is 20.6 Celsius
    
  • La cadena de formato compuesto no es correcto. Cuando esto sucede, el FormatException excepción siempre es un resultado de error de desarrollador. Se debe corregir en lugar de controlar en un try/catch bloque.

    Intentando incluir llaves literales en una cadena, como el siguiente ejemplo does, se producirá la excepción.

    result = String.Format("The text has {0} '{' characters and {1} '}' characters.",
                           nOpen, nClose);
    

    La técnica recomendada para incluir las llaves literales en una cadena de formato compuesto es incluirlos en la lista de objetos y usar elementos de formato para insertarlos en la cadena de resultado. Por ejemplo, puede modificar la cadena de formato compuesto anterior como se muestra aquí.

    result = String.Format("The text has {0} '{{' characters and {1} '}}' characters.",
                           nOpen, nClose);
    

    La excepción también se produce si la cadena de formato contiene un error de escritura. La llamada siguiente a la String.Format método omite una llave de cierre y pares de una llave de apertura con un corchete de cierre.

    int n1 = 10;
    int n2 = 20;
    String result = String.Format("{0 + {1] = {2}", 
                                  n1, n2, n1 + n2);
    

    Para corregir el error, asegúrese de que corresponden todos abriendo y llaves de cierre.

    String result = String.Format("{0} + {1} = {2}", 
                                  n1, n2, n1 + n2);
    
  • Ha proporcionado la lista de objetos en un método como una matriz de parámetros fuertemente tipados, de formato compuesto y FormatException excepción indica que el índice de uno o más elementos de formato supera el número de argumentos en la lista de objetos. Esto ocurre porque no existe ninguna conversión explícita entre los tipos de matriz, por lo que en su lugar, que el compilador trata la matriz como un argumento único en lugar de una matriz de parámetros. Por ejemplo, la llamada siguiente a la Console.WriteLine(String, Object[]) método produce un FormatException excepción, aunque el índice más alto de los elementos de formato es 3 y la matriz de parámetros de tipo Int32 tiene cuatro elementos.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          Random rnd = new Random();
          int[]  numbers = new int[4];
          int total = 0;
          for (int ctr = 0; ctr <= 2; ctr++) {
             int number = rnd.Next(1001);
             numbers[ctr] = number;
             total += number;
          }   
          numbers[3] = total;
          Console.WriteLine("{0} + {1} + {2} = {3}", numbers);   
       }
    }
    // The example displays the following output:
    //    Unhandled Exception: 
    //    System.FormatException: 
    //       Index (zero based) must be greater than or equal to zero and less than the size of the argument list.
    //       at System.Text.StringBuilder.AppendFormat(IFormatProvider provider, String format, Object[] args)
    //       at System.IO.TextWriter.WriteLine(String format, Object arg0)
    //       at System.IO.TextWriter.SyncTextWriter.WriteLine(String format, Object arg0)
    //       at Example.Main()
    

    En lugar de controlar esta excepción, debe eliminar su causa. Dado que Visual Basic ni C# puede convertir una matriz de enteros en una matriz de objetos, tendrá que realizar la conversión antes de llamar al método de formato compuesto. En el ejemplo siguiente se proporciona una implementación.

    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          Random rnd = new Random();
          int[]  numbers = new int[4];
          int total = 0;
          for (int ctr = 0; ctr <= 2; ctr++) {
             int number = rnd.Next(1001);
             numbers[ctr] = number;
             total += number;
          }   
          numbers[3] = total;
          object[] values = new object[numbers.Length];
          numbers.CopyTo(values, 0);
          Console.WriteLine("{0} + {1} + {2} = {3}", values);   
       }
    }
    // The example displays output like the following:
    //        477 + 956 + 901 = 2334
    

FormatException utiliza HRESULT COR_E_FORMAT, que tiene el valor 0 x 80131537.

La FormatException clase se deriva de Exception y no agrega ningún miembro único. Para obtener una lista de valores de propiedad iniciales de una instancia de FormatException, consulte el FormatException constructores.

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 1.1
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Windows Phone
Disponible desde 8.1

Cualquier miembro ( Compartido en Visual Basic) estático público de este tipo es seguro para subprocesos. No se garantiza que los miembros de instancia sean seguros para subprocesos.

Volver al principio
Mostrar: