什么是System.TypeInitializationException

作为类初始值设定项引发的异常的包装器而引发的异常。

继承
Object
Exception
SystemException

TypeInitializationException

详细说明

当类初始值设定项初始化类型失败时,将创建一个 TypeInitializationException,并向其传递对由该类型的类初始值设定项引发的异常的引用。 InnerException 的TypeInitializationException属性包含基础异常。

通常情况下TypeInitializationException , 异常反映灾难性条件 (运行时无法实例化类型), 这会阻止应用程序继续。 最常见的TypeInitializationException情况是, 在应用程序的执行环境中发生某些更改时引发。 因此, 除了故障排除调试代码外, 不应在try catch块中/处理异常。 相反, 应调查并消除异常的原因。

引发的原因一般情况如下:

静态构造函数和 System.typeinitializationexception 异常

    • 静态构造函数 (如果存在) 在创建类型的新实例之前由运行时自动调用。 静态构造函数可以由开发人员显式定义。 如果未显式定义静态构造函数, 则编译器会自动创建一个构造函数static以初始化C#该类型Shared的任何 (在中) 或 (在 Visual Basic 中) 成员。 有关静态构造函数的详细信息, 请参阅静态构造函数。

      通常, 当静态TypeInitializationException构造函数无法实例化类型时, 将引发异常。 InnerException属性指示静态构造函数无法实例化类型的原因。 TypeInitializationException异常的一些更常见的原因如下:

      • 静态构造函数中出现未经处理的异常

        如果在静态构造函数中引发异常, 则会将该异常包装在TypeInitializationException异常中, 并且无法实例化该类型。

        通常导致此异常难以解决的问题是: 静态构造函数并不总是在源代码中显式定义。 如果存在以下情况, 则类型中存在静态构造函数:

        • 它已显式定义为类型的成员。

        • 该类型static在单个语句中声明Shared和初始化的 (in C#) 或 (in Visual Basic) 变量。 在这种情况下, 语言编译器将为该类型生成静态构造函数。 可以通过使用实用程序 (如IL 拆装器) 进行检查。 例如, 当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

      下面的示例演示TypeInitializationException由编译器生成的静态构造函数引发的异常。 C# Shared类包含类型为TestClass的 (在中) 或 (在 Visual Basic 中) 字段, 该字段通过将值3传递到其类构造函数进行实例化。 static Example 然而, 此值是非法的;只允许值0或1。 因此, TestClass类构造函数会ArgumentOutOfRangeException引发。 由于不处理此异常, 因此它将被包装在TypeInitializationException异常中。

      C#
    • 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();
      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()

      请注意, 异常消息会显示有关属性InnerException的信息。

    • 缺少程序集或数据文件

      出现TypeInitializationException异常的常见原因是, 应用程序的开发和测试环境中存在的程序集或数据文件从其运行时环境中丢失。 例如, 可以使用以下命令行语法将下面的示例编译为名为 Missing1a 的程序集:

      C#
csc -t:library Missing1a.cs
C#
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;
}
}

然后, 可以通过包含对 Missing1a 的引用, 将以下示例编译到名为 Missing1 的可执行文件:

C#
csc Missing1.cs /r:Missing1a.dll

但是, 如果重命名、移动或删除 Missing1a 并运行该示例, 则会引发TypeInitializationException异常并显示示例中所示的输出。 请注意, 异常消息包括有关属性的InnerException信息。 在这种情况下, 内部异常是FileNotFoundException引发的, 因为运行时找不到依赖程序集。

C#
using System;

public class Example
{
public static void Main()
{
Person p = new Person("John", "Doe");
Console.WriteLine(p);
}
} public class Person
{
static InfoModule infoModule; String fName;
String mName;
String lName; static Person()
{
infoModule = new InfoModule(DateTime.UtcNow);
} public Person(String fName, String lName)
{
this.fName = fName;
this.lName = lName;
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()

备注

在此示例中, TypeInitializationException引发了异常, 因为未能加载程序集。 如果静态构造函数尝试打开数据文件 (如配置文件、XML 文件或包含序列化数据的文件), 则也可能会引发异常。

正则表达式匹配超时值

可以为每个应用程序域设置正则表达式模式匹配操作的默认超时值。 超时TimeSpan值由指定AppDomain.SetData方法的 "REGEX_DEFAULT_MATCH_TIMEOUT" 属性的值来定义。 时间间隔必须是大于零且TimeSpan小于24天的有效对象。 如果未满足这些要求, 则设置默认超时值的尝试将引发ArgumentOutOfRangeException, 而这反过来会被包装TypeInitializationException在异常中。

日历和文化数据

如果尝试实例化日历但运行时无法实例化CultureInfo对应于该日历的对象, 则会TypeInitializationException引发异常。 以下 calendar 类构造函数可能会引发此异常:

  • JapaneseCalendar类的无参数构造函数。

  • KoreanCalendar类的无参数构造函数。

  • TaiwanCalendar类的无参数构造函数。

由于这些区域性的区域性数据应在所有系统上都可用, 因此, 您几乎不会遇到此异常。

HRESULT

TypeInitializationException使用 COR_E_TYPEINITIALIZATION 值为0x80131534 的 HRESULT。

关于System.TypeInitializationException异常的更多相关文章

  1. C#使用NLOG System.TypeInitializationException,类型初始值设定项引发异常

    C#如何使用NLOG,网上有很多介绍,本次使用时遇到一个问题,使用NLOG写日志时,出现初始化异常,基本异常信息如下: System.AggregateException: 发生一个或多个错误. -- ...

  2. String.Net “System.TypeInitializationException”类型的未经处理的异常在 Spring.NetDemo.exe 中发生

    今天编写String.Net时,遇到“System.TypeInitializationException”类型的未经处理的异常在 Spring.NetDemo.exe 中发生 原因配置文件的顺序写错 ...

  3. System.TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception. ---> Oracle.DataAccess.Client.OracleException: 提供程序与此版本的 Oracle 客户机不兼容”

    .net应用程序通过Oracle.DataAccess.dll访问64位的Oracle服务器,在连接时出现以下异常:“System.TypeInitializationException: The t ...

  4. An unhandled exception of type 'System.TypeInitializationException' occurred in System.ServiceModel.dll

    异常“ An unhandled exception of type 'System.TypeInitializationException' occurred in System.ServiceMo ...

  5. System.TypeInitializationException

    在连接数据库时,提示System.TypeInitializationException 数据库的连接字符串放在config文件中,而config中有两个文件,起初放在debug.comfig中,启动 ...

  6. 关于SubSonic3.0插件使用SqlQuery或Select查询时产生的System.NullReferenceException异常修复

    早上在编写执行用例时,突然爆异常System.NullReferenceException: 未将对象引用设置到对象的实例 执行代码:

  7. 关于SubSonic3.0查询或更新时出现System.NullReferenceException异常的处理

    在调试程序时,同事发现添加记录时,出现了System.NullReferenceException异常 DictBase dict = new DictBase();    dict.DictCode ...

  8. System.TypeInitializationException: The type initializer for 'Mono.Unix.Native.Stdlib' threw an exception.

    08-31 17:02:03: ### DEBUG ##########################System.TypeInitializationException: The type ini ...

  9. System.TypeInitializationException: 'The type initializer for 'MySql.Data.MySqlClient.Replication.ReplicationManager' threw an exception.'

    下午在调试的时候报错数据库连接就报错我就很纳闷后面用原来的代码写发现还是报错 System.TypeInitializationException: 'The type initializer for ...

随机推荐

  1. FPGA 软件平台

    FPGA软件平台 系统 --> windows 7 xilinx --> vivado 2016.4 xilinx --> ISE 14.7 Altera --> quartu ...

  2. 关于MVC与三层架构

    详情 回答一: 当然啊,你要明白三层架构的MVC的区别和联系: 三层架构是最基本的项目分层结果,而MVC则是三层架构的一个变体,MVC是一种好的开发模式.首先你要明白MVC分别代表的是什么意思. M  ...

  3. String类的方法应用

    String类的几个方法的应用示例: using System;using System.Collections.Generic;using System.Linq;using System.Text ...

  4. WebApi验证

    如何实现RESTful Web API的身份验证   最近想拿一个小项目来试水RESTful Web API,项目只有几个调用,比较简单,但同样需要身份验证,如果是传统的网站的话,那不用说,肯定是用户 ...

  5. 关于BASE 24 ,BASE 64原理以及实现程序

    关于BASE 24 ,BASE 64原理以及实现程序 来源 https://wangye.org/blog/archives/5/ 可能很多人听说过Base64编码,很少有人听说过Base24编码,B ...

  6. 在python当中使用redis

    redis数据库 # 1.安装redis与可视化操作工具 # 2.在服务中管理redis服务器的开启关闭 # 3.命令行简单使用redis: -- redis-cli # 启动客户端 -- set k ...

  7. HTML5 表单新增内容

    一.H5 新增控件 1.datalist 元素 datalist 标签定义选项列表,请与 input 元素配合使用该元素.可为输入框提供一个可选的列表,可以直接选择列表项,也可以不选择列表中的项,自行 ...

  8. Android源码分析(三)-----系统框架设计思想

    一 : 术在内而道在外 Android系统的精髓在源码之外,而不在源码之内,代码只是一种实现人类思想的工具,仅此而已...... 近来发现很多关于Android文章都是以源码的方向入手分析Androi ...

  9. Git拉取Gitlab上的代码时,报128的解决方法

    今天拉取gitlab上的代码时出现错误,一直返回128 首先我们确定我们在存储库上有没有权限,然后我就去项目中的 Members上看是否有权限,然后发现也是有的. 然后克隆的时候发现输入一万遍密码都还 ...

  10. 爬虫之scrapy核心组件

    Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可用于如数据 ...