TypeInitializationException Osztály

Definíció

Az osztály inicializálója által kidobott kivétel körül burkolóként megjelenő kivétel. Ez az osztály nem örökölhető.

public ref class TypeInitializationException sealed : Exception
public ref class TypeInitializationException sealed : SystemException
public sealed class TypeInitializationException : Exception
public sealed class TypeInitializationException : SystemException
[System.Serializable]
public sealed class TypeInitializationException : SystemException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class TypeInitializationException : SystemException
type TypeInitializationException = class
    inherit Exception
type TypeInitializationException = class
    inherit SystemException
[<System.Serializable>]
type TypeInitializationException = class
    inherit SystemException
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type TypeInitializationException = class
    inherit SystemException
Public NotInheritable Class TypeInitializationException
Inherits Exception
Public NotInheritable Class TypeInitializationException
Inherits SystemException
Öröklődés
TypeInitializationException
Öröklődés
TypeInitializationException
Attribútumok

Megjegyzések

Ha egy osztály inicializálója nem tud inicializálni egy típust, létrejön egy TypeInitializationException , és a rendszer átadja a típus osztály inicializálója által okozott kivételre mutató hivatkozást. A InnerException tulajdonsága tartalmazza a TypeInitializationException mögöttes kivételt.

A kivétel általában TypeInitializationException egy katasztrofális állapotot tükröz (a futtatókörnyezet nem tud példányosítani egy típust), amely megakadályozza, hogy egy alkalmazás tovább működjön. A leggyakrabban az TypeInitializationException akkor dobják, amikor valamilyen változás történik az alkalmazás futtatási környezetében. Következésképpen a hibakeresési kód hibaelhárításán kívül a kivételt nem szabad blokkokban try/catch kezelni. Ehelyett a kivétel okát meg kell vizsgálni és meg kell szüntetni.

TypeInitializationException A HRESULT COR_E_TYPEINITIALIZATIONfüggvényt használja, amelynek értéke 0x80131534.

A TypeInitializationException példány kezdeti tulajdonságainak listájáért tekintse meg a TypeInitializationException konstruktorokat.

Az alábbi szakaszok ismertetik azokat a helyzeteket, amelyekben TypeInitializationException kivétel történik.

Statikus konstruktorok

Ha létezik statikus konstruktor, a futtatókörnyezet automatikusan meghív egy statikus konstruktort, mielőtt létrehozna egy új típusú példányt. A statikus konstruktorokat a fejlesztő explicit módon definiálhatja. Ha egy statikus konstruktor nincs explicit módon definiálva, a fordítók automatikusan létrehoznak egyet a típus bármely static (C# vagy F#) vagy Shared (Visual Basic)-tagjának inicializálásához. A statikus konstruktorokról további információt a Statikus konstruktorok című témakörben talál.

A rendszer általában kivételt TypeInitializationException jelez, ha egy statikus konstruktor nem tud példányosítani egy típust. A InnerException tulajdonság azt jelzi, hogy a statikus konstruktor miért nem tudta példányosítani a típust. A kivétel leggyakoribb okai TypeInitializationException a következők:

  • Kezeletlen kivétel statikus konstruktorban

    Ha egy statikus konstruktorban kivétel keletkezik, akkor az a kivétel egy TypeInitializationException kivételbe van csomagolva, és a típus nem példányosítható.

    Ez a kivétel gyakran megnehezíti a hibaelhárítást, mivel a statikus konstruktorok nem mindig vannak explicit módon definiálva a forráskódban. Statikus konstruktor akkor létezik egy típusban, ha:

    • Explicit módon egy típus tagjaként lett definiálva.

    • Az ilyen típusú változók egyszerre deklarálva és inicializálva vannak egy utasításban: static (C# vagy F# esetén) vagy Shared (Visual Basic esetén). Ebben az esetben a nyelvi fordító statikus konstruktort hoz létre a típushoz. Ha például a C# és a VB fordítói a következő példát állítják össze, létrehozzák az IL-t egy ehhez hasonló statikus konstruktorhoz:

      .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
      

    Az alábbi példa egy TypeInitializationException , a fordító által létrehozott statikus konstruktor által okozott kivételt mutat be. Az Example osztály tartalmaz egy static (C#-ban) vagy Shared (Visual Basic-ben) típusú TestClass mezőt, amelyet a példányosított érték 3-at ad át az osztálykonstruktornak. Ez az érték azonban illegális; csak 0 vagy 1 érték engedélyezett. Ennek eredményeként az TestClass osztálykonstruktor hibát dob egy ArgumentOutOfRangeException formájában. Mivel ezt a kivételt nem kezeli, egy TypeInitializationException kivételbe csomagolja.

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

    A kivételüzenet a tulajdonságra vonatkozó InnerException információkat jeleníti meg.

  • Hiányzó szerelvény vagy adatfájl

    A kivétel gyakori oka TypeInitializationException , hogy egy alkalmazás fejlesztési és tesztelési környezetében található szerelvény vagy adatfájl hiányzik a futtatókörnyezetből. A következő példát például lefordíthatja egy Missing1a.dll nevű szerelvényre ezzel a parancssori szintaxissal:

    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
    

    Ezután lefordíthatja a következő példát egy Missing1.exe nevű végrehajtható fájlra a Missing1a.dllhivatkozásával:

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

    Ha azonban átnevezi, áthelyezi vagy törli a Missing1a.dll-t, és futtatja a példát, az kivételt dob, és megjeleníti a példában látható kimenetet. Vegye figyelembe, hogy a kivételüzenet a tulajdonságra vonatkozó InnerException információkat tartalmaz. Ebben az esetben a belső kivétel egy FileNotFoundException, amely azért keletkezik, mert a futtatókörnyezet nem találja a függő szerelvényt.

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

    Megjegyzés:

    Ebben a példában egy TypeInitializationException kivételt dobtak, mert egy összetevőt nem sikerült betölteni. A kivétel akkor is előfordulhat, ha egy statikus konstruktor olyan adatfájlt próbál megnyitni, például konfigurációs fájlt, XML-fájlt vagy szerializált adatokat tartalmazó fájlt, amelyet nem talál.

Reguláris kifejezésegyezés időtúllépési értékei

Egy reguláris kifejezésminta-egyeztetési művelet alapértelmezett időtúllépési értékét alkalmazástartományonként állíthatja be. Az időtúllépést úgy határozzák meg, hogy a "REGEX_DEFAULT_MATCH_TIMEOUT" tulajdonság TimeSpan értékét megadják a AppDomain.SetData metódus számára. Az időintervallumnak nullánál nagyobb és körülbelül 24 napnál rövidebb érvényes TimeSpan objektumnak kell lennie. Ha ezek a követelmények nem teljesülnek, az alapértelmezett időtúllépési érték beállítására tett kísérlet egy ArgumentOutOfRangeException kivételt dob, amelyet egy TypeInitializationException kivételbe burkolnak.

Az alábbi példa bemutatja azt a TypeInitializationException, amely akkor van dobva, amikor a "REGEX_DEFAULT_MATCH_TIMEOUT" tulajdonsághoz hozzárendelt érték érvénytelen. A kivétel megszüntetéséhez állítsa a "REGEX_DEFAULT_MATCH_TIMEOUT" tulajdonságot TimeSpan nullánál nagyobb és körülbelül 24 napnál rövidebb értékre.

using System;
using System.Text.RegularExpressions;
using static System.Net.Mime.MediaTypeNames;

public class RegexEx1
{
    public static void Run()
    {
        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: {rgx.ToString()}");
        Console.WriteLine($"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 'AppDomain data 'REGEX_DEFAULT_MATCH_TIMEOUT' contains the invalid value or object
//       '-00:00:02' 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, CultureInfo culture)
//       at RegexEx1.Run()
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()

Naptárak és kulturális adatok

Ha megkísérli a naptár példányosítását, de a futtatókörnyezet nem tudja példányosítani az CultureInfo adott naptárnak megfelelő objektumot, TypeInitializationException kivételt dob. Ezt a kivételt a következő naptárosztály-konstruktorok okozhatják:

Mivel ezeknek a kultúráknak a kulturális adatainak minden rendszeren rendelkezésre kell állniuk, ritkán, ha valaha is előfordul ez a kivétel.

Konstruktorok

Name Description
TypeInitializationException(String, Exception)

Inicializálja az TypeInitializationException osztály új példányát az alapértelmezett hibaüzenettel, a megadott típusnévvel és a kivétel kiváltó okaként szolgáló belső kivételre mutató hivatkozással.

Tulajdonságok

Name Description
Data

Lekéri a kulcs-/érték párok gyűjteményét, amelyek további, felhasználó által definiált információkat biztosítanak a kivételről.

(Öröklődés forrása Exception)
HelpLink

Lekéri vagy beállítja a kivételhez társított súgófájlra mutató hivatkozást.

(Öröklődés forrása Exception)
HResult

Lekéri vagy beállítja a HRESULT-ot, egy kódolt numerikus értéket, amely egy adott kivételhez van hozzárendelve.

(Öröklődés forrása Exception)
InnerException

Lekéri az Exception aktuális kivételt okozó példányt.

(Öröklődés forrása Exception)
Message

Az aktuális kivételt leíró üzenet jelenik meg.

(Öröklődés forrása Exception)
Source

Lekéri vagy beállítja az alkalmazás vagy a hibát okozó objektum nevét.

(Öröklődés forrása Exception)
StackTrace

Lekéri a hívásverem közvetlen kereteinek sztringképét.

(Öröklődés forrása Exception)
TargetSite

Lekéri az aktuális kivételt okozó metódust.

(Öröklődés forrása Exception)
TypeName

Lekéri annak a típusnak a teljes nevét, amely nem inicializálható.

Metódusok

Name Description
Equals(Object)

Meghatározza, hogy a megadott objektum egyenlő-e az aktuális objektummal.

(Öröklődés forrása Object)
GetBaseException()

Ha egy származtatott osztály felül van bírálva, egy Exception vagy több későbbi kivétel kiváltó okát adja vissza.

(Öröklődés forrása Exception)
GetHashCode()

Ez az alapértelmezett kivonatoló függvény.

(Öröklődés forrása Object)
GetObjectData(SerializationInfo, StreamingContext)
Elavult.

Beállítja az SerializationInfo objektumot a típusnévvel és a további kivételadatokkal.

GetType()

Lekéri az aktuális példány futtatókörnyezeti típusát.

(Öröklődés forrása Exception)
MemberwiseClone()

Az aktuális Objectpéldány sekély másolatát hozza létre.

(Öröklődés forrása Object)
ToString()

Létrehozza és visszaadja az aktuális kivétel sztring-ábrázolását.

(Öröklődés forrása Exception)

esemény

Name Description
SerializeObjectState
Elavult.

Akkor fordul elő, ha a kivétel szerializálva van egy kivételállapot-objektum létrehozásához, amely szerializált adatokat tartalmaz a kivételről.

(Öröklődés forrása Exception)

A következőre érvényes:

Lásd még