この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

FormatException クラス

 

公開日: 2016年10月

引数の形式が無効な場合、または複合書式指定文字列が整形式でない場合にスローされる例外。

名前空間:   System
アセンブリ:  mscorlib (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

名前説明
System_CAPS_pubmethodFormatException()

FormatException クラスの新しいインスタンスを初期化します。

System_CAPS_protmethodFormatException(SerializationInfo, StreamingContext)

シリアル化したデータを使用して、FormatException クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodFormatException(String)

指定したエラー メッセージを使用して、FormatException クラスの新しいインスタンスを初期化します。

System_CAPS_pubmethodFormatException(String, Exception)

指定したエラー メッセージおよびこの例外の原因となった内部例外への参照を使用して、FormatException クラスの新しいインスタンスを初期化します。

名前説明
System_CAPS_pubpropertyData

例外に関する追加のユーザー定義情報を提供する、キー/値ペアのコレクションを取得します。(Exception から継承されます。)

System_CAPS_pubpropertyHelpLink

この例外に関連付けられているヘルプ ファイルへのリンクを取得または設定します。(Exception から継承されます。)

System_CAPS_pubpropertyHResult

特定の例外に割り当てられているコード化数値である HRESULT を取得または設定します。(Exception から継承されます。)

System_CAPS_pubpropertyInnerException

現在の例外の原因となる Exception インスタンスを取得します。(Exception から継承されます。)

System_CAPS_pubpropertyMessage

現在の例外を説明するメッセージを取得します。(Exception から継承されます。)

System_CAPS_pubpropertySource

エラーの原因となるアプリケーションまたはオブジェクトの名前を取得または設定します。(Exception から継承されます。)

System_CAPS_pubpropertyStackTrace

呼び出し履歴で直前のフレームの文字列形式を取得します。(Exception から継承されます。)

System_CAPS_pubpropertyTargetSite

現在の例外がスローされたメソッドを取得します。(Exception から継承されます。)

名前説明
System_CAPS_pubmethodEquals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。(Object から継承されます。)

System_CAPS_protmethodFinalize()

オブジェクトがガベージ コレクションにより収集される前に、そのオブジェクトがリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。)

System_CAPS_pubmethodGetBaseException()

派生クラスでオーバーライドされた場合、それ以後に発生する 1 つ以上の例外の主要な原因である Exception を返します。(Exception から継承されます。)

System_CAPS_pubmethodGetHashCode()

既定のハッシュ関数として機能します。(Object から継承されます。)

System_CAPS_pubmethodGetObjectData(SerializationInfo, StreamingContext)

派生クラスでオーバーライドされた場合は、その例外に関する情報を使用して SerializationInfo を設定します。(Exception から継承されます。)

System_CAPS_pubmethodGetType()

現在のインスタンスのランタイム型を取得します。(Exception から継承されます。)

System_CAPS_protmethodMemberwiseClone()

現在の Object の簡易コピーを作成します。(Object から継承されます。)

System_CAPS_pubmethodToString()

現在の例外の文字列形式を作成して返します。(Exception から継承されます。)

名前説明
System_CAPS_proteventSerializeObjectState

例外がシリアル化され、例外に関するシリアル化されたデータを含む例外状態オブジェクトが作成されたときに発生します。(Exception から継承されます。)

A FormatException 理由として、次のいずれかの例外がスローされます。

  • 文字列のデータ型に変換するメソッドの呼び出しでは、文字列は、必要なパターンに適合していません。 これの一部のメソッドを呼び出すときに通常発生する、 Convert クラスおよび ParseParseExact いくつかの型のメソッドです。

    ほとんどの場合、変換する文字列がユーザーによって入力または、ファイルを読み取る場合に特にを使用して、 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) メソッド、日付と時刻のデータが従う必要がありますも まったく 1 つまたは複数が指定したパターンに 標準書式指定文字列 または カスタム書式指定文字列 はメソッド呼び出しの引数として提供されています。 予定のカルチャに固有のパターンに準拠していない場合、 FormatException 例外がスローされます。 つまり、1 つのシステムのカルチャに固有の書式に保存された日付と時刻のデータは、別のシステムで正常に解析できません可能性があります。

      日付と時刻の解析の詳細については、次を参照してください。 .NET Framework における日付と時刻文字列の解析の解析 と例外をスローしたメソッドのドキュメントです。

    • GUID。GUID の文字列形式の 32 の 16 進数字 (0 ~ F) で構成されている必要があり、によって出力される、5 つの形式のいずれかである必要があります、 Guid.ToString メソッドです。 詳細については、Guid.Parse メソッドを参照してください。

    • すべての符号付き整数、符号なし整数および浮動小数点型を含む数値型。解析する文字列は、ラテン語の数字 0 ~ 9 の限必要です。 正または負記号、桁区切り記号、桁区切り記号、および通貨記号も許可される場合があります。 常にスローの文字を含むその他の文字列を解析しようとしている、 FormatException 例外です。

      すべての数値の文字列は、特定のカルチャの書式指定規則に基づいて解釈されます。 現在のスレッド カルチャ (または場合によっては、アプリケーション ドメインの現在のカルチャで)、インバリアント カルチャまたは指定されたカルチャ。 その結果、1 つのカルチャの規則を使用して解析される数値の文字列が別の規則を使用する場合に失敗します。

      数値の文字列の解析の詳細については、次を参照してください。 .NET Framework における数値文字列の解析 と、例外がスローされた特定のメソッドのドキュメントです。

    • 時間間隔。固定のカルチャに依存しない形式で、または現在のスレッド カルチャによって (か、場合によっては、アプリケーション ドメインの現在のカルチャ) で定義されているカルチャに依存した形式で解析する文字列は、インバリアント カルチャまたは指定されたカルチャ。 文字列が適切な形式または最小値、日、時間単位での場合ではない、時間間隔の分のコンポーネントが存在しない場合は、解析メソッドがスローされます、 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()
    

    コードのエラーでは、この例外が発生します。 エラーを解決するには、書式指定文字列を削除するか有効なものを置換します。 次の例では、"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.
    

    A FormatException などのメソッドを解析して例外をスローすることも DateTime.ParseExactGuid.ParseExact, 、書式指定文字列で指定されたパターンに正確に準拠するように解析する文字列を必要とします。 次の例では、"G"標準書式指定文字列で指定されたパターンに準拠するように、GUID の文字列表現が必要です。 ただし、 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()
    

    この例外は、コードのエラーによっても発生します。 これを修正するなど、正確な形式を必要としない解析メソッドを呼び出す 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
    
  • 1 つ以上の書式項目のインデックスの 複合書式指定文字列 がオブジェクトのリストまたはパラメーターの配列内の項目のインデックスよりも大きいです。 次の例では、書式指定文字列の書式指定項目の最大インデックスは 3 です。 オブジェクトの一覧で項目のインデックスが 0 から始まるので、この書式指定文字列には次の 4 つの項目がオブジェクトの一覧が必要です。 代わりに、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()
    

    ここで、 FormatException 開発者のエラーの結果に送信されます。 なくするように修正で処理される、 try/catch オブジェクトの一覧内の各項目は、書式指定項目のインデックスに対応していることを確認することによってブロックされます。 この例を修正するを参照する 2 番目の書式指定項目のインデックスを変更、 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
    
  • 複合書式指定文字列が整形式ではありません。 この場合、 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.Format メソッドは、右中かっこを省略し、右角かっことかっこのペアです。

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

    エラーを修正するには、すべてを開くと終わり中かっこと一致するを確認します。

    String result = String.Format("{0} + {1} = {2}", 
                                  n1, n2, n1 + n2);
    
  • 複合書式指定を厳密に型指定されたパラメーター配列としてのメソッドでオブジェクトの一覧を指定した、 FormatException 例外では、1 つまたは複数の書式指定項目のインデックスがオブジェクトの一覧の引数の数を超えたことを示します。 これは、配列型の間の明示的な変換が存在しないため、そのため、コンパイラはパラメーター配列ではなく、単一の引数として、配列を扱いますに発生します。 たとえば、次の呼び出し、 Console.WriteLine(String, Object[]) メソッドがスローされます、 FormatException 例外、書式指定項目の最も大きいインデックスは、3、および型のパラメーターの配列が Int32 は 4 つの要素があります。

    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()
    

    この例外を処理する代わりに、原因を排除する必要があります。 Visual Basic や c# のどちらもで整数の配列をオブジェクト配列に変換できるため、複合書式指定メソッドを呼び出す前に自分で変換を実行する必要があります。 次の例では、1 つの実装を提供します。

    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 値は 0x80131537 HRESULT COR_E_FORMAT を使用します。

FormatException クラスから派生する Exception し、一意のメンバーは追加されません。 インスタンスの初期プロパティ値の一覧については FormatException, を参照してください、 FormatException コンス トラクターです。

ユニバーサル Windows プラットフォーム
8 以降で使用可能
.NET Framework
1.1 以降で使用可能
ポータブル クラス ライブラリ
サポート対象: 移植可能 .NET プラットフォーム
Silverlight
2.0 以降で使用可能
Windows Phone Silverlight
7.0 以降で使用可能
Windows Phone
8.1 以降で使用可能

この型のパブリック static (Visual Basic では Shared ) メンバーはスレッド セーフです。インスタンス メンバーの場合は、スレッド セーフであるとは限りません。

トップに戻る
表示: