Share via


Kelas System.TypeInitializationException

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Ketika penginisialisasi kelas gagal menginisialisasi jenis, dibuat TypeInitializationException dan meneruskan referensi ke pengecualian yang dilemparkan oleh penginisialisasi kelas jenis. Properti InnerException memegang TypeInitializationException pengecualian yang mendasar.

Biasanya, TypeInitializationException pengecualian mencerminkan kondisi bencana (runtime tidak dapat membuat instans jenis) yang mencegah aplikasi untuk melanjutkan. Paling umum, TypeInitializationException dilemparkan sebagai respons terhadap beberapa perubahan dalam lingkungan aplikasi yang mengeksekusi. Akibatnya, selain mungkin untuk memecahkan masalah kode debug, pengecualian tidak boleh ditangani dalam try/catch blok. Sebaliknya, penyebab pengecualian harus diselidiki dan dihilangkan.

TypeInitializationException menggunakan HRESULT COR_E_TYPEINITIALIZATION, yang memiliki nilai 0x80131534.

Untuk daftar nilai properti awal untuk instans TypeInitializationException, lihat TypeInitializationException konstruktor.

Bagian berikut menjelaskan beberapa situasi di mana TypeInitializationException pengecualian dilemparkan.

Konstruktor statik

Konstruktor statis, jika ada, dipanggil secara otomatis oleh runtime sebelum membuat instans baru jenis. Konstruktor statis dapat didefinisikan secara eksplisit oleh pengembang. Jika konstruktor statis tidak ditentukan secara eksplisit, pengkompilasi secara otomatis membuatnya untuk menginisialisasi static anggota jenis (dalam C# atau F#) atau Shared (di Visual Basic). Untuk informasi selengkapnya tentang konstruktor statis, lihat Konstruktor Statis.

Paling umum, TypeInitializationException pengecualian dilemparkan ketika konstruktor statis tidak dapat membuat instans jenis. Properti InnerException menunjukkan mengapa konstruktor statis tidak dapat membuat instans jenis. Beberapa penyebab pengecualian yang TypeInitializationException lebih umum adalah:

  • Pengecualian yang tidak tertangani dalam konstruktor statis

    Jika pengecualian dilemparkan dalam konstruktor statis, pengecualian tersebut dibungkus dalam TypeInitializationException pengecualian, dan jenisnya tidak dapat dibuat.

    Apa yang sering membuat pengecualian ini sulit untuk memecahkan masalah adalah bahwa konstruktor statis tidak selalu didefinisikan secara eksplisit dalam kode sumber. Konstruktor statis ada dalam jenis jika:

    • Ini telah secara eksplisit didefinisikan sebagai anggota jenis.

    • Jenis memiliki static variabel (dalam C# atau F#) atau Shared (dalam Visual Basic) yang dideklarasikan dan diinisialisasi dalam satu pernyataan. Dalam hal ini, pengkompilasi bahasa menghasilkan konstruktor statis untuk jenis tersebut. Anda dapat memeriksanya dengan menggunakan utilitas seperti Il Disassembler. Misalnya, ketika pengkompilasi C# dan VB mengkompilasi contoh berikut, mereka menghasilkan IL untuk konstruktor statis yang mirip dengan ini:

    .method private specialname rtspecialname static
             void  .cctor() cil managed
    {
       // Code size       12 (0xc)
       .maxstack  8
       IL_0000:  ldc.i4.3
       IL_0001:  newobj     instance void TestClass::.ctor(int32)
       IL_0006:  stsfld     class TestClass Example::test
       IL_000b:  ret
    } // end of method Example::.cctor
    

    Contoh berikut menunjukkan pengecualian yang TypeInitializationException dilemparkan oleh konstruktor statis yang dihasilkan kompilator. Kelas Example menyertakan static bidang TestClass jenis (dalam C#) atau Shared (di Visual Basic) yang dibuat dengan meneruskan nilai 3 ke konstruktor kelasnya. Namun, nilai itu ilegal; hanya nilai 0 atau 1 yang diizinkan. Akibatnya, TestClass konstruktor kelas melempar ArgumentOutOfRangeException. Karena pengecualian ini tidak ditangani, pengecualian dibungkus TypeInitializationException .

    using System;
    
    public class Example
    {
       private static TestClass test = new TestClass(3);
       
       public static void Main()
       {
          Example ex = new Example();
          Console.WriteLine(test.Value);
       }
    }
    
    public class TestClass
    {
       public readonly int Value;
       
       public TestClass(int value)
       {
          if (value < 0 || value > 1) throw new ArgumentOutOfRangeException(nameof(value));
          Value = value;
       }
    }
    // The example displays the following output:
    //    Unhandled Exception: System.TypeInitializationException: 
    //       The type initializer for 'Example' threw an exception. ---> 
    //       System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
    //       at TestClass..ctor(Int32 value)
    //       at Example..cctor()
    //       --- End of inner exception stack trace ---
    //       at Example.Main()
    
    Public Class Example1
        Shared test As New TestClass(3)
    
        Public Shared Sub Main()
            Dim ex As New Example1()
            Console.WriteLine(test.Value)
        End Sub
    End Class
    
    Public Class TestClass
       Public ReadOnly Value As Integer
       
       Public Sub New(value As Integer)
            If value < 0 Or value > 1 Then Throw New ArgumentOutOfRangeException(NameOf(value))
            value = value
       End Sub
    End Class
    ' The example displays the following output:
    '    Unhandled Exception: System.TypeInitializationException: 
    '       The type initializer for 'Example' threw an exception. ---> 
    '       System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
    '       at TestClass..ctor(Int32 value)
    '       at Example..cctor()
    '       --- End of inner exception stack trace ---
    '       at Example.Main()
    

    Perhatikan bahwa pesan pengecualian menampilkan informasi tentang InnerException properti .

  • Rakitan atau file data yang hilang

    Penyebab TypeInitializationException umum pengecualian adalah bahwa assembly atau file data yang ada di lingkungan pengembangan dan pengujian aplikasi hilang dari lingkungan runtimenya. Misalnya, Anda dapat mengkompilasi contoh berikut ke rakitan bernama Missing1a.dll dengan menggunakan sintaks baris perintah ini:

    csc -t:library Missing1a.cs
    
    fsc --target:library Missing1a.fs
    
    vbc Missing1a.vb -t:library
    
    using System;
    
    public class InfoModule
    {
       private DateTime firstUse;
       private int ctr = 0;
    
       public InfoModule(DateTime dat)
       {
          firstUse = dat;
       }
       
       public int Increment()
       {
          return ++ctr;
       }
       
       public DateTime GetInitializationTime()
       {
          return firstUse;
       }
    }
    
    open System
    
    type InfoModule(firstUse: DateTime) =
        let mutable ctr = 0
    
        member _.Increment() =
            ctr <- ctr + 1
            ctr
       
        member _.GetInitializationTime() =
            firstUse
    
    Public Class InfoModule
       Private firstUse As DateTime
       Private ctr As Integer = 0
    
       Public Sub New(dat As DateTime)
          firstUse = dat
       End Sub
       
       Public Function Increment() As Integer
          ctr += 1
          Return ctr
       End Function
       
       Public Function GetInitializationTime() As DateTime
          Return firstUse
       End Function
    End Class
    

    Anda kemudian dapat mengkompilasi contoh berikut ke executable bernama Missing1.exe dengan menyertakan referensi ke Missing1a.dll:

    csc Missing1.cs /r:Missing1a.dll
    
    vbc Missing1.vb /r:Missing1a.dll
    

    Namun, jika Anda mengganti nama, memindahkan, atau menghapus Missing1a.dll dan menjalankan contoh, itu melemparkan TypeInitializationException pengecualian dan menampilkan output yang ditunjukkan dalam contoh. Perhatikan bahwa pesan pengecualian menyertakan informasi tentang InnerException properti . Dalam hal ini, pengecualian dalam adalah FileNotFoundException yang dilemparkan karena runtime tidak dapat menemukan rakitan dependen.

    using System;
    
    public class MissingEx1
    {
        public static void Main()
        {
            Person p = new Person("John", "Doe");
            Console.WriteLine(p);
        }
    }
    
    public class Person
    {
        static readonly InfoModule s_infoModule;
    
        readonly string _fName;
        readonly string _lName;
    
        static Person()
        {
            s_infoModule = new InfoModule(DateTime.UtcNow);
        }
    
        public Person(string fName, string lName)
        {
            _fName = fName;
            _lName = lName;
            s_infoModule.Increment();
        }
    
        public override string ToString()
        {
            return string.Format("{0} {1}", _fName, _lName);
        }
    }
    // The example displays the following output if missing1a.dll is renamed or removed:
    //    Unhandled Exception: System.TypeInitializationException: 
    //       The type initializer for 'Person' threw an exception. ---> 
    //       System.IO.FileNotFoundException: Could not load file or assembly 
    //       'Missing1a, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 
    //       or one of its dependencies. The system cannot find the file specified.
    //       at Person..cctor()
    //       --- End of inner exception stack trace ---
    //       at Person..ctor(String fName, String lName)
    //       at Example.Main()
    
    open System
    
    type Person(fName, lName) =
        static let infoModule = InfoModule DateTime.UtcNow
        
        do infoModule.Increment() |> ignore
       
        override _.ToString() =
            $"{fName} {lName}"
    let p = Person("John", "Doe")
    
    printfn $"{p}"
    // The example displays the following output if missing1a.dll is renamed or removed:
    //    Unhandled Exception: System.TypeInitializationException: 
    //       The type initializer for 'Person' threw an exception. ---> 
    //       System.IO.FileNotFoundException: Could not load file or assembly 
    //       'Missing1a, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 
    //       or one of its dependencies. The system cannot find the file specified.
    //       at Person..cctor()
    //       --- End of inner exception stack trace ---
    //       at Person..ctor(String fName, String lName)
    //       at Example.Main()
    
    Module Example3
        Public Sub Main()
            Dim p As New Person("John", "Doe")
            Console.WriteLine(p)
        End Sub
    End Module
    
    Public Class Person
       Shared infoModule As InfoModule
       
       Dim fName As String
       Dim mName As String
       Dim lName As String
       
       Shared Sub New()
          infoModule = New InfoModule(DateTime.UtcNow)
       End Sub
       
       Public Sub New(fName As String, lName As String)
          Me.fName = fName
          Me.lName = lName
          infoModule.Increment()
       End Sub
       
       Public Overrides Function ToString() As String
          Return String.Format("{0} {1}", fName, lName)
       End Function
    End Class
    ' The example displays the following output if missing1a.dll is renamed or removed:
    '    Unhandled Exception: System.TypeInitializationException: 
    '       The type initializer for 'Person' threw an exception. ---> 
    '       System.IO.FileNotFoundException: Could not load file or assembly 
    '       'Missing1a, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 
    '       or one of its dependencies. The system cannot find the file specified.
    '       at Person..cctor()
    '       --- End of inner exception stack trace ---
    '       at Person..ctor(String fName, String lName)
    '       at Example.Main()
    

    Catatan

    Dalam contoh ini, TypeInitializationException pengecualian dilemparkan karena rakitan tidak dapat dimuat. Pengecualian juga dapat dilemparkan jika konstruktor statis mencoba membuka file data, seperti file konfigurasi, file XML, atau file yang berisi data berseri, yang tidak dapat ditemukan.

Nilai batas waktu pencocokan ekspresi reguler

Anda dapat mengatur nilai batas waktu default untuk operasi pencocokan pola ekspresi reguler berdasarkan domain per aplikasi. Batas waktu ditentukan oleh menentukan TimeSpan nilai untuk properti "REGEX_DEFAULT_MATCH_TIMEOUT" ke AppDomain.SetData metode . Interval waktu harus berupa TimeSpan objek valid yang lebih besar dari nol dan kurang dari sekitar 24 hari. Jika persyaratan ini tidak terpenuhi, upaya untuk mengatur nilai batas waktu default melempar , yang pada gilirannya dibungkus ArgumentOutOfRangeExceptiondalam TypeInitializationException pengecualian.

Contoh berikut menunjukkan TypeInitializationException yang dilemparkan ketika nilai yang ditetapkan ke properti "REGEX_DEFAULT_MATCH_TIMEOUT" tidak valid. Untuk menghilangkan pengecualian, atur properti "REGEX_DEFAULT_MATCH_TIMEOUT" ke TimeSpan nilai yang lebih besar dari nol dan kurang dari sekitar 24 hari.

using System;
using System.Text.RegularExpressions;

public class RegexEx1
{
    public static void Main()
    {
        AppDomain domain = AppDomain.CurrentDomain;
        // Set a timeout interval of -2 seconds.
        domain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT", TimeSpan.FromSeconds(-2));

        Regex rgx = new Regex("[aeiouy]");
        Console.WriteLine("Regular expression pattern: {0}", rgx.ToString());
        Console.WriteLine("Timeout interval for this regex: {0} seconds",
                          rgx.MatchTimeout.TotalSeconds);
    }
}
// The example displays the following output:
//    Unhandled Exception: System.TypeInitializationException: 
//       The type initializer for 'System.Text.RegularExpressions.Regex' threw an exception. ---> 
//       System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
//       Parameter name: AppDomain data 'REGEX_DEFAULT_MATCH_TIMEOUT' contains an invalid value or 
//       object for specifying a default matching timeout for System.Text.RegularExpressions.Regex.
//       at System.Text.RegularExpressions.Regex.InitDefaultMatchTimeout()
//       at System.Text.RegularExpressions.Regex..cctor()
//       --- End of inner exception stack trace ---
//       at System.Text.RegularExpressions.Regex..ctor(String pattern)
//       at Example.Main()
open System
open System.Text.RegularExpressions

let domain = AppDomain.CurrentDomain
// Set a timeout interval of -2 seconds.
domain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT", TimeSpan.FromSeconds -2)

let rgx = Regex "[aeiouy]"
printfn $"Regular expression pattern: {rgx}"
printfn $"Timeout interval for this regex: {rgx.MatchTimeout.TotalSeconds} seconds"
// The example displays the following output:
//    Unhandled Exception: System.TypeInitializationException: 
//       The type initializer for 'System.Text.RegularExpressions.Regex' threw an exception. ---> 
//       System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
//       Parameter name: AppDomain data 'REGEX_DEFAULT_MATCH_TIMEOUT' contains an invalid value or 
//       object for specifying a default matching timeout for System.Text.RegularExpressions.Regex.
//       at System.Text.RegularExpressions.Regex.InitDefaultMatchTimeout()
//       at System.Text.RegularExpressions.Regex..cctor()
//       --- End of inner exception stack trace ---
//       at System.Text.RegularExpressions.Regex..ctor(String pattern)
//       at Example.Main()
Imports System.Text.RegularExpressions

Module Example4
    Public Sub Main()
        Dim domain As AppDomain = AppDomain.CurrentDomain
        ' Set a timeout interval of -2 seconds.
        domain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT", TimeSpan.FromSeconds(-2))

        Dim rgx As New Regex("[aeiouy]")
        Console.WriteLine("Regular expression pattern: {0}", rgx.ToString())
        Console.WriteLine("Timeout interval for this regex: {0} seconds",
                        rgx.MatchTimeout.TotalSeconds)
    End Sub
End Module
' The example displays the following output:
'    Unhandled Exception: System.TypeInitializationException: 
'       The type initializer for 'System.Text.RegularExpressions.Regex' threw an exception. ---> 
'       System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
'       Parameter name: AppDomain data 'REGEX_DEFAULT_MATCH_TIMEOUT' contains an invalid value or 
'       object for specifying a default matching timeout for System.Text.RegularExpressions.Regex.
'       at System.Text.RegularExpressions.Regex.InitDefaultMatchTimeout()
'       at System.Text.RegularExpressions.Regex..cctor()
'       --- End of inner exception stack trace ---
'       at System.Text.RegularExpressions.Regex..ctor(String pattern)
'       at Example.Main()

Kalender dan data budaya

Jika Anda mencoba membuat instans kalender tetapi runtime tidak dapat membuat instans objek yang sesuai dengan kalender tersebut CultureInfo , itu akan memberikan TypeInitializationException pengecualian. Pengecualian ini dapat dilemparkan oleh konstruktor kelas kalender berikut:

Karena data budaya untuk budaya ini harus tersedia di semua sistem, Anda harus jarang, jika pernah, mengalami pengecualian ini.