TypeInitializationException の原因と直し方
静的コンストラクタ(staticフィールドの初期化を含む)の中で例外が起きると、直接の例外ではなくTypeInitializationExceptionに包まれて報告されます。
エラーメッセージの読み方
Unhandled exception. System.TypeInitializationException: The type initializer for 'Settings' threw an exception.
System- 名前空間 — System なら標準の基本例外です
TypeInitializationException- 例外クラス — 何が起きたか。ここを検索するのが最短です
The type initializer for 'Settings' threw an exception.- 詳細メッセージ — どの値が問題だったか
at Settings..cctor() in Program.cs:line 5- 発生箇所 — スタックトレースの先頭行
このエラーが出る典型パターン
パターン1
1 class Settings { 2 public static int Value; 3 static Settings() { 4 int denom = 0; ^ 5 Value = 100 / denom; 6 } 7 } 8 class Program { 9 static void Main(string[] args) { 10 System.Console.WriteLine(Settings.Value); 11 } 12 }
Unhandled exception. System.TypeInitializationException: The type initializer for 'Settings' threw an exception.
at Settings..cctor() in Program.cs:line 5
静的コンストラクタの中で例外が起きると、直接の例外ではなくTypeInitializationExceptionに包まれて報告されます。原因は内側のInnerExceptionにあります。
直し方: 0 を 2 にします。
広告
広告スロット(未設定)
パターン2
1 class Catalog { 2 public static string FirstItem; 3 static Catalog() { 4 string[] items = { "pen", "cup" }; 5 FirstItem = items[5 ]; ^ 6 } 7 } 8 class Program { 9 static void Main(string[] args) { 10 System.Console.WriteLine(Catalog.FirstItem); 11 } 12 }
Unhandled exception. System.TypeInitializationException: The type initializer for 'Catalog' threw an exception.
at Catalog..cctor() in Program.cs:line 5
IndexOutOfRangeExceptionのような別の例外でも、静的コンストラクタ内で起きた時点でTypeInitializationExceptionに包まれます。
直し方: 5 を 0 にします。
パターン3
1 class Parser { 2 public static int Parsed; 3 static Parser() { 4 Parsed = int.Parse("N/A"); ^ 5 } 6 } 7 class Program { 8 static void Main(string[] args) { 9 System.Console.WriteLine(Parser.Parsed); 10 } 11 }
Unhandled exception. System.TypeInitializationException: The type initializer for 'Parser' threw an exception.
at Parser..cctor() in Program.cs:line 4
FormatExceptionが原因でも同じです。静的コンストラクタの中で投げられた例外は種類を問わずTypeInitializationExceptionに包まれます。
直し方: "N/A" を "42" にします。
よくある誤解
スタックトレースの一番外側だけを見るとTypeInitializationExceptionが原因に見えますが、本当の原因は「--->」で示される内側の例外(InnerException)にあります。
まとめ
TypeInitializationExceptionは上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。