TypeInitializationException Класс

Определение

Исключение, которое создается в качестве оболочки вокруг исключения, создаваемого инициализатором класса. Этот класс не наследуется.

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
Наследование
TypeInitializationException
Наследование
TypeInitializationException
Атрибуты

Комментарии

Если инициализатор класса не может инициализировать тип, TypeInitializationException создается и передается ссылка на исключение, вызываемое инициализатором класса типа. Свойство InnerExceptionTypeInitializationException содержит базовое исключение.

Как правило, TypeInitializationException исключение отражает катастрофическую ситуацию (среда выполнения не может создать экземпляр типа), которая мешает приложению продолжать работу. Чаще всего TypeInitializationException вызывается в ответ на некоторые изменения в среде выполнения приложения. Следовательно, за исключением случаев, когда это необходимо для поиска и устранения неисправностей в коде отладки, исключение не должно обрабатываться в блоке try/catch. Вместо этого следует исследовать и устранить причину исключения.

TypeInitializationException использует HRESULT COR_E_TYPEINITIALIZATION, который имеет значение 0x80131534.

Список начальных значений свойств для экземпляра TypeInitializationExceptionсм. в конструкторах TypeInitializationException.

В следующих разделах описаны некоторые ситуации, в которых выбрасывается исключение TypeInitializationException.

Статические конструкторы

Статический конструктор, если он существует, вызывается автоматически средой выполнения перед созданием нового экземпляра типа. Статические конструкторы могут быть явно определены разработчиком. Если статический конструктор не определен явным образом, компиляторы автоматически создают его для инициализации любых static (в C# или F#) или Shared (в Visual Basic) элементов типа. Дополнительные сведения о статических конструкторах см. в разделе "Статические конструкторы".

Чаще всего выбрасывается исключение, TypeInitializationException если статический конструктор не может создать экземпляр типа. Свойство InnerException указывает, почему статический конструктор не смог создать экземпляр типа. Ниже приведены некоторые из наиболее распространенных TypeInitializationException причин исключения:

  • Необработанное исключение в статическом конструкторе

    Если в статическом конструкторе выбрасывается исключение, это исключение упаковывается в исключение TypeInitializationException, и экземпляр типа не может быть создан.

    Что часто делает это исключение сложным для устранения неполадок, заключается в том, что статические конструкторы не всегда явно определены в исходном коде. Статический конструктор существует в типе, если:

    • Он был явно определен как член типа.

    • Тип имеет static переменные (в C# или F#) или Shared (в Visual Basic), объявленные и инициализированные в одной инструкции. В этом случае компилятор языка создает статический конструктор для типа. Например, когда компиляторы C# и VB компилируют следующий пример, они создают IL для статического конструктора, аналогичного этому:

      .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
      

    В следующем примере показано исключение, возникшее в статическом конструкторе, сгенерированном компилятором. Класс Example включает static поле типа Shared (в C#) или TestClass (в Visual Basic), которое создается путем передачи значения 3 в конструктор класса. Однако это значение является незаконным; Разрешены только значения 0 или 1. В результате TestClass конструктор класса выбрасывает исключение ArgumentOutOfRangeException. Поскольку это исключение не обрабатывается, оно оборачивается в 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))
            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()
    

    Сообщение об исключении отображает сведения о свойстве InnerException .

  • Отсутствует сборка или файл данных

    Распространенной причиной TypeInitializationException исключения является отсутствие сборки или файла данных, которые присутствовали в средах разработки и тестирования приложения, но отсутствуют в его среде выполнения. Например, можно скомпилировать следующий пример в сборку с именем Missing1a.dll с помощью этого синтаксиса командной строки:

    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
    

    Затем можно скомпилировать следующий пример в исполняемый файл с именем Missing1.exe, включив ссылку на Missing1a.dll:

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

    Однако если вы переименовываете TypeInitializationException , перемещаете или удаляете Missing1a.dll и запускаете пример, он создает исключение и отображает выходные данные, показанные в примере. Обратите внимание, что сообщение об исключении содержит сведения о свойстве InnerException . В этом случае внутреннее исключение — это FileNotFoundException исключение, которое возникает, так как среда выполнения не может найти зависимую сборку.

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

    Замечание

    В этом примере было выброшено TypeInitializationException исключение, так как сборку не удалось загрузить. Исключение также может быть вызвано, если статический конструктор пытается открыть файл данных, например файл конфигурации, XML-файл или файл, содержащий сериализованные данные, что он не может найти.

Значения времени ожидания совпадений регулярных выражений

Значение времени ожидания по умолчанию можно задать для операции сопоставления шаблонов регулярных выражений на основе домена для каждого приложения. Время ожидания задается с помощью указания значения TimeSpan для свойства "REGEX_DEFAULT_MATCH_TIMEOUT" в методе AppDomain.SetData. Интервал времени должен быть допустимым TimeSpan объектом, который больше нуля и меньше приблизительно 24 дней. Если эти требования не выполнены, попытка задать значение времени ожидания по умолчанию вызывает исключение ArgumentOutOfRangeException, которое, в свою очередь, упаковывается в TypeInitializationException исключение.

В следующем примере показан TypeInitializationException, который вызывается, когда назначенное свойству "REGEX_DEFAULT_MATCH_TIMEOUT" значение недопустимо. Чтобы исключить исключение, задайте для свойства TimeSpan "REGEX_DEFAULT_MATCH_TIMEOUT" значение, которое больше нуля и меньше 24 дней.

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

Календари и культурные данные

Если вы пытаетесь создать экземпляр календаря, но среда выполнения не может создать экземпляр CultureInfo объекта, соответствующего этому календарю, выбрасывает TypeInitializationException исключение. Это исключение можно создать следующими конструкторами классов календаря:

  • Конструктор без параметров класса JapaneseCalendar.
  • Конструктор без параметров класса KoreanCalendar.
  • Конструктор без параметров класса TaiwanCalendar.

Так как культурные данные для этих региональных параметров должны быть доступны во всех системах, вы вряд ли, если вообще, столкнетесь с этим исключением.

Конструкторы

Имя Описание
TypeInitializationException(String, Exception)

Инициализирует новый экземпляр TypeInitializationException класса с сообщением об ошибке по умолчанию, указанным именем типа и ссылкой на внутреннее исключение, которое является основной причиной этого исключения.

Свойства

Имя Описание
Data

Возвращает коллекцию пар "ключ-значение", которые предоставляют дополнительные пользовательские сведения об исключении.

(Унаследовано от Exception)
HelpLink

Возвращает или задает ссылку на файл справки, связанный с этим исключением.

(Унаследовано от Exception)
HResult

Возвращает или задает HRESULT, закодированное числовое значение, назначенное определенному исключению.

(Унаследовано от Exception)
InnerException

Exception Возвращает экземпляр, вызвавшего текущее исключение.

(Унаследовано от Exception)
Message

Возвращает сообщение, описывающее текущее исключение.

(Унаследовано от Exception)
Source

Возвращает или задает имя приложения или объекта, вызывающего ошибку.

(Унаследовано от Exception)
StackTrace

Возвращает строковое представление непосредственных кадров в стеке вызовов.

(Унаследовано от Exception)
TargetSite

Возвращает метод, который вызывает текущее исключение.

(Унаследовано от Exception)
TypeName

Возвращает полное имя типа, который не может инициализировать.

Методы

Имя Описание
Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetBaseException()

При переопределении в производном классе возвращает Exception первопричину одного или нескольких последующих исключений.

(Унаследовано от Exception)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetObjectData(SerializationInfo, StreamingContext)
Устаревшие.

SerializationInfo Задает объект с именем типа и дополнительными сведениями об исключении.

GetType()

Возвращает тип среды выполнения текущего экземпляра.

(Унаследовано от Exception)
MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
ToString()

Создает и возвращает строковое представление текущего исключения.

(Унаследовано от Exception)

События

Имя Описание
SerializeObjectState
Устаревшие.

Происходит при сериализации исключения для создания объекта состояния исключения, содержащего сериализованные данные об исключении.

(Унаследовано от Exception)

Применяется к

См. также раздел