FormatException Класс

Определение

Исключение, которое возникает в случае, если формат аргумента недопустим или строка составного формата построена неправильно.

public ref class FormatException : Exception
public ref class FormatException : SystemException
public class FormatException : Exception
public class FormatException : SystemException
[System.Serializable]
public class FormatException : SystemException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class FormatException : SystemException
type FormatException = class
    inherit Exception
type FormatException = class
    inherit SystemException
[<System.Serializable>]
type FormatException = class
    inherit SystemException
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type FormatException = class
    inherit SystemException
Public Class FormatException
Inherits Exception
Public Class FormatException
Inherits SystemException
Наследование
FormatException
Наследование
FormatException
Производный
Атрибуты

Комментарии

FormatExceptionИсключение может быть вызвано одной из следующих причин:

  • При вызове метода, который преобразует строку в другой тип данных, строка не соответствует требуемому шаблону. Обычно это происходит при вызове некоторых методов Convert класса и Parse ParseExact методов и некоторых типов.

    В большинстве случаев, в частности, если Преобразуемая строка является входной пользователем или считывается из файла, следует использовать try/catch блок и обрабатывайте FormatException исключение, если преобразование завершилось неудачно. Также можно заменить вызов метода преобразования вызовом TryParse TryParseExact метода или, если он существует. Однако FormatException исключение, возникающее при попытке проанализировать стандартную или жестко заданную строку, указывает на ошибку программы. В этом случае следует исправить ошибку, а не обрабатывайте исключение.

    Преобразование строки в следующие типы в System пространстве имен может вызвать FormatException исключение:

    • Boolean. Для Boolean.Parse(String) Convert.ToBoolean(String) методов и требуется, чтобы строка была преобразована в значение "true", "true", "false" или "false". Любое другое значение вызывает FormatException исключение.

    • DateTime и DateTimeOffset. Все данные даты и времени обрабатываются на основе соглашений о форматировании для определенного языка и региональных параметров: текущий язык и региональные параметры (или, в некоторых случаях, культура текущего домена приложения), инвариантный язык и региональные параметры. При вызове DateTime.ParseExact(String, String, IFormatProvider, DateTimeStyles) методов и DateTimeOffset.ParseExact(String, String[], IFormatProvider, DateTimeStyles) данные даты и времени должны также точно соответствовать шаблону, заданному одним или несколькими строками стандартного формата или строками настраиваемого формата , которые предоставляются в качестве аргументов в вызове метода. Если он не соответствует ожидаемому шаблону, зависящему от языка и региональных параметров, FormatException возникает исключение. Это означает, что данные даты и времени, сохраненные в формате, зависящем от языка и региональных параметров, в одной системе могут быть успешно проанализированы в другой системе.

      Дополнительные сведения о синтаксическом анализе даты и времени см. в разделе синтаксический анализ строк даты и времени и документация для метода, вызвавшего исключение.

    • Идентификаторы GUID. Строковое представление GUID должно состоять из 32 шестнадцатеричных цифр (0 – F) и должно быть в одном из пяти выходных форматов, выводимых Guid.ToString методом. Дополнительные сведения см. в описании метода Guid.Parse.

    • Числовые типы, включая все целые числа со знаком, целые числа без знака и типы с плавающей запятой. Анализируемая строка должна состоять из латинских цифр 0-9. Допускается также использование положительных или отрицательных знаков, разделителей групп и символов валюты. При попытке синтаксического анализа строки, содержащей любой другой символ, всегда возникает FormatException исключение.

      Все числовые строки интерпретируется на основе соглашений о форматировании для определенного языка и региональных параметров: текущего языка и региональных параметров, инвариантного языка и региональных параметров. В результате числовая строка, проанализированная с использованием соглашений одного языка и региональных параметров, может завершиться ошибкой при использовании соглашений другого.

      Дополнительные сведения о синтаксическом анализе числовых строк см. в разделе синтаксический анализ числовых строк и документация для конкретного метода, вызвавшего исключение.

    • Интервалы времени. Анализируемая строка должна быть либо в формате без учета языка и региональных параметров, либо в формате с учетом языка и региональных параметров, определяемом текущим языком и региональными параметрами, инвариантным языком и региональными параметрами. Если строка не находится в соответствующем формате или, по крайней мере, компоненты дней, часов и минут интервала времени отсутствуют, метод анализа создает FormatException исключение. Дополнительные сведения см. в документации по TimeSpan методу синтаксического анализа, который вызвал исключение.

  • Тип реализует IFormattable интерфейс, который поддерживает строки формата, определяющие, как объект преобразуется в строковое представление, и используется недопустимая строка формата. Это наиболее распространенная операция форматирования. В следующем примере строка стандартного формата "Q" используется в строке составного формата для форматирования числа. Однако "Q" не является допустимой строкой стандартного формата.

    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()
    
    Module Example
       Public Sub Main()
          Dim price As Decimal = 169.32d
          Console.WriteLine("The cost is {0:Q2}.", price)
       End Sub
    End Module
    ' 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()
    

    Это исключение возникает из-за ошибки в коде. Чтобы исправить ошибку, либо удалите строку формата, либо замените допустимый. В следующем примере ошибка исправляется путем замены недопустимой строки формата строкой формата "C" (Currency).

    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.
    
    Module Example
       Public Sub Main()
          Dim price As Decimal = 169.32d
          Console.WriteLine("The cost is {0:C2}.", price)
       End Sub
    End Module
    ' The example displays the following output:
    '   The cost is $169.32.
    

    FormatExceptionИсключение также может вызываться методами синтаксического анализа, такими как DateTime.ParseExact и Guid.ParseExact , для которых требуется синтаксический анализ строки для точного соответствия шаблону, заданному строкой формата. В следующем примере предполагается, что строковое представление идентификатора GUID соответствует шаблону, заданному строкой стандартного формата "G". Однако Guid реализация структуры IFormattable не поддерживает строку формата 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()
    
    Module Example
       Public Sub Main()
          Dim guidString As String = "ba748d5c-ae5f-4cca-84e5-1ac5291c38cb"
          Console.WriteLine(Guid.ParseExact(guidString, "G"))
       End Sub
    End Module
    ' 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()
    

    Это исключение также приводит к ошибке в коде. Чтобы исправить его, вызовите метод синтаксического анализа, который не требует точного формата, например DateTime.Parse или Guid.Parse , или замените строку допустимого формата. В следующем примере ошибка исправляется путем вызова Guid.Parse метода.

    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
    
    Module Example
       Public Sub Main()
          Dim guidString As String = "ba748d5c-ae5f-4cca-84e5-1ac5291c38cb"
          Console.WriteLine(Guid.Parse(guidString))
       End Sub
    End Module
    ' The example displays the following output:
    '   ba748d5c-ae5f-4cca-84e5-1ac5291c38cb
    
  • Один или несколько индексов элементов формата в строке составного формата больше, чем индексы элементов в списке объектов или массиве параметров. В следующем примере самый крупный индекс элемента формата в строке форматирования равен 3. Поскольку индексы элементов в списке объектов отсчитываются от нуля, эта строка формата потребует, чтобы список объектов имел четыре элемента. Вместо этого он содержит только три, dat , temp и scale , поэтому код выдает FormatException исключение во время выполнения:.

    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()
    
    Module Example
       Public Enum TemperatureScale As Integer
          Celsius
          Fahrenheit
          Kelvin
       End Enum
    
       Public Sub Main()
          Dim info As String = GetCurrentTemperature()
          Console.WriteLine(info)
       End Sub
    
       Private Function GetCurrentTemperature() As String
          Dim dat As Date = Date.Now
          Dim temp As Decimal = 20.6d
          Dim scale As TemperatureScale = TemperatureScale.Celsius
          Dim result As String 
          
          result = String.Format("At {0:t} on {1:D}, the temperature is {2:F1} {3:G}",
                                 dat, temp, scale)    
          Return result
       End Function
    End Module
    ' 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()
    

    В этом случае FormatException исключение является результатом ошибки разработчика. Его следует исправить, а не обрабатывать в try/catch блоке, убедившись, что каждый элемент в списке объектов соответствует индексу элемента форматирования. Чтобы исправить этот пример, измените индекс второго элемента форматирования, чтобы он ссылался на dat переменную, и уменьшите индекс каждого последующего элемента форматирования на единицу.

    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
    
    Module Example
       Public Enum TemperatureScale As Integer
          Celsius
          Fahrenheit
          Kelvin
       End Enum
    
       Public Sub Main()
          Dim info As String = GetCurrentTemperature()
          Console.WriteLine(info)
       End Sub
    
       Private Function GetCurrentTemperature() As String
          Dim dat As Date = Date.Now
          Dim temp As Decimal = 20.6d
          Dim scale As TemperatureScale = TemperatureScale.Celsius
          Dim result As String 
          
          result = String.Format("At {0:t} on {0:D}, the temperature is {1:F1} {2:G}",
                                 dat, temp, scale)    
          Return result
       End Function
    End Module
    ' The example displays output like the following:
    '       At 10:40 AM on Wednesday, June 04, 2014, the temperature is 20.6 Celsius
    
  • Строка составного формата не имеет правильного формата. В этом случае FormatException исключение всегда является результатом ошибки разработчика. Его следует исправить, а не обрабатывать в try/catch блоке.

    При попытке включить в строку литеральные скобки, как показано в следующем примере, вызовет исключение.

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

    Рекомендуемый способ включения литеральных скобок в строку составного формата состоит в том, чтобы включить их в список объектов и использовать элементы форматирования для вставки их в результирующую строку. Например, можно изменить предыдущую строку составного формата, как показано здесь.

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

    Исключение также создается, если строка формата содержит опечатку. Следующий вызов String.Format метода опускает закрывающую фигурную скобку и пары открывающей скобки с закрывающей скобкой.

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

    Чтобы исправить ошибку, убедитесь, что все открывающие и закрывающие фигурные скобки соответствуют.

    String result = String.Format("{0} + {1} = {2}",
                                  n1, n2, n1 + n2);
    
    Dim result As String = String.Format("{0} + {1} = {2}", 
                                         n1, n2, n1 + n2)
    
  • Вы указали список объектов в методе составного форматирования как строго типизированный массив параметров, а FormatException исключение указывает, что индекс одного или нескольких элементов формата превышает число аргументов в списке объектов. Это происходит потому, что явное преобразование между типами массивов не существует, поэтому компилятор обрабатывает массив как единственный аргумент, а не как массив параметров. Например, следующий вызов Console.WriteLine(String, Object[]) метода вызывает FormatException исключение, хотя самый верхний индекс элементов формата — 3, а массив параметров типа — Int32 четыре элемента.

    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()
    
    Imports System.Collections.Generic
    
    Module Example
       Public Sub Main()
          Dim rnd As New Random()
          Dim numbers(3) As Integer
          Dim total As Integer = 0
          For ctr = 0 To 2
             Dim number As Integer = rnd.Next(1001)
             numbers(ctr) = number
             total += number
          Next
          numbers(3) = total
          Console.WriteLine("{0} + {1} + {2} = {3}", numbers)   
       End Sub
    End Module
    ' 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()
    

    Вместо обработки этого исключения следует устранить его причину. поскольку ни Visual Basic, ни C# не могут преобразовать массив целых чисел в массив объектов, необходимо выполнить преобразование самостоятельно перед вызовом метода составного форматирования. В следующем примере показано, как это делается.

    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
    
    Imports System.Collections.Generic
    
    Module Example
       Public Sub Main()
          Dim rnd As New Random()
          Dim numbers(3) As Integer
          Dim total As Integer = 0
          For ctr = 0 To 2
             Dim number As Integer = rnd.Next(1001)
             numbers(ctr) = number
             total += number
          Next
          numbers(3) = total
          Dim values(numbers.Length - 1) As Object
          numbers.CopyTo(values, 0) 
          Console.WriteLine("{0} + {1} + {2} = {3}", values)   
       End Sub
    End Module
    ' The example displays output like the following:
    '       477 + 956 + 901 = 2334
    

FormatException использует COR_E_FORMAT HRESULT, имеющий значение 0x80131537.

FormatExceptionКласс является производным от Exception и не добавляет уникальных членов. Список начальных значений свойств для экземпляра FormatException, см. в разделе FormatException конструкторы.

Конструкторы

FormatException()

Инициализирует новый экземпляр класса FormatException.

FormatException(SerializationInfo, StreamingContext)

Инициализирует новый экземпляр класса FormatException с сериализованными данными.

FormatException(String)

Инициализирует новый экземпляр класса FormatException с указанным сообщением об ошибке.

FormatException(String, Exception)

Инициализирует новый экземпляр класса FormatException указанным сообщением об ошибке и ссылкой на внутреннее исключение, вызвавшее данное исключение.

Свойства

Data

Возвращает коллекцию пар «ключ-значение», предоставляющую дополнительные сведения об исключении.

(Унаследовано от Exception)
HelpLink

Получает или задает ссылку на файл справки, связанный с этим исключением.

(Унаследовано от Exception)
HResult

Возвращает или задает HRESULT — кодированное числовое значение, присвоенное определенному исключению.

(Унаследовано от Exception)
InnerException

Возвращает экземпляр класса Exception, который вызвал текущее исключение.

(Унаследовано от Exception)
Message

Возвращает сообщение, описывающее текущее исключение.

(Унаследовано от Exception)
Source

Возвращает или задает имя приложения или объекта, вызывавшего ошибку.

(Унаследовано от Exception)
StackTrace

Получает строковое представление непосредственных кадров в стеке вызова.

(Унаследовано от Exception)
TargetSite

Возвращает метод, создавший текущее исключение.

(Унаследовано от Exception)

Методы

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetBaseException()

При переопределении в производном классе возвращает исключение Exception, которое является первопричиной одного или нескольких последующих исключений.

(Унаследовано от Exception)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetObjectData(SerializationInfo, StreamingContext)

При переопределении в производном классе задает объект SerializationInfo со сведениями об исключении.

(Унаследовано от Exception)
GetType()

Возвращает тип среды выполнения текущего экземпляра.

(Унаследовано от Exception)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ToString()

Создает и возвращает строковое представление текущего исключения.

(Унаследовано от Exception)

События

SerializeObjectState
Является устаревшей.

Возникает, когда исключение сериализовано для создания объекта состояния исключения, содержащего сериализованные данные об исключении.

(Унаследовано от Exception)

Применяется к

См. также раздел