FormatException 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
当自变量的格式无效或复合格式字符串的格式不标准时引发的异常。
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由于以下原因之一,可能会引发异常:
在调用将字符串转换为其他数据类型的方法时,字符串不符合所需的模式。 这通常在调用 类
Parse
的某些方法和Convert某些类型的 和ParseExact
方法时发生。在大多数情况下,尤其是要转换的字符串由用户输入或从文件中读取时,应使用
try/catch
F#) 块中的 (try/with
,并在转换失败时处理 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()
let price = 169.32m printfn $"The cost is {price:Q2}." // The example displays the following output: // Unhandled Exception: System.FormatException: Format specifier was invalid. // at System.Number.NumberToString(ValueStringBuilder& sb, NumberBuffer& number, Char format, Int32 nMaxDigits, NumberFormatInfo info) // at System.Number.TryFormatDecimal(Decimal value, ReadOnlySpan`1 format, NumberFormatInfo info, Span`1 destination, Int32& charsWritten) // at System.Decimal.TryFormat(Span`1 destination, Int32& charsWritten, ReadOnlySpan`1 format, IFormatProvider provider) // at System.Text.ValueStringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args) // at System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args) // at Microsoft.FSharp.Core.PrintfImpl.InterpolandToString@917.Invoke(Object vobj) // at Microsoft.FSharp.Core.PrintfImpl.PrintfEnv`3.RunSteps(Object[] args, Type[] argTys, Step[] steps) // at Microsoft.FSharp.Core.PrintfModule.gprintf[a,TState,TResidue,TResult,TPrinter](FSharpFunc`2 envf, PrintfFormat`4 format) // at <StartupCode$fs>.$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” (货币) 格式字符串来更正此错误。
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.
let price = 169.32m printfn $"The cost is {price:C2}." // 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()
open System let guidString = "ba748d5c-ae5f-4cca-84e5-1ac5291c38cb" printfn $"""{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 <StartupCode$fs>.$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()
此异常也由编码错误导致。 若要更正它,请调用不需要精确格式(如 或 Guid.Parse)DateTime.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
open System let guidString = "ba748d5c-ae5f-4cca-84e5-1ac5291c38cb" printfn $"{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。 由于对象列表中项的索引是从零开始的,因此此格式字符串需要对象列表有四个项。 相反,它只有三个 FormatException 、
dat
temp
、 和scale
,因此代码在运行时会导致异常: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()
open System type TemperatureScale = | Celsius = 0 | Fahrenheit = 1 | Kelvin = 2 let getCurrentTemperature () = let dat = DateTime.Now let temp = 20.6m let scale = TemperatureScale.Celsius String.Format("At {0:t} on {1:D}, the temperature is {2:F1} {3:G}", dat, temp, scale) getCurrentTemperature () |> printfn "%s" // The example displays output like the following: // Unhandled Exception: System.FormatException: Format specifier was invalid. // at System.Number.NumberToString(ValueStringBuilder& sb, NumberBuffer& number, Char format, Int32 nMaxDigits, NumberFormatInfo info) // at System.Number.TryFormatDecimal(Decimal value, ReadOnlySpan`1 format, NumberFormatInfo info, Span`1 destination, Int32& charsWritten) // at System.Decimal.TryFormat(Span`1 destination, Int32& charsWritten, ReadOnlySpan`1 format, IFormatProvider provider) // at System.Text.ValueStringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args) // at System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args) // at System.String.Format(String format, Object arg0, Object arg1, Object arg2) // at Example.getCurrentTemperature() // at <StartupCode$fs>.$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
变量,并将每个后续格式项的索引递减 1。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
open System type TemperatureScale = | Celsius = 0 | Fahrenheit = 1 | Kelvin = 2 let getCurrentTemperature () = let dat = DateTime.Now let temp = 20.6m let scale = TemperatureScale.Celsius String.Format("At {0:t} on {0:D}, the temperature is {1:F1} {2:G}", dat, temp, scale) getCurrentTemperature () |> printfn "%s" // 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);
let 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);
let 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.Format 以下调用省略右大括号,并将左大括号与右括号配对。
int n1 = 10; int n2 = 20; String result = String.Format("{0 + {1] = {2}", n1, n2, n1 + n2);
let n1 = 10 let 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);
let 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[])会引发异常,尽管格式项的最高索引为 3,并且 类型的Int32参数数组有四个FormatException元素。
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()
open System let rnd = Random() let numbers = Array.zeroCreate<int> 4 let mutable total = 0 for i = 0 to 2 do let number = rnd.Next 1001 numbers[i] <- number total <- 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 <StartupCode$fs>.$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
open System let rnd = Random() let numbers = Array.zeroCreate<int> 4 let mutable total = 0 for i = 0 to 2 do let number = rnd.Next 1001 numbers[i] <- number total <- total + number numbers[3] <- total let values = Array.zeroCreate<obj> 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 使用 HRESULT COR_E_FORMAT,其值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) |