为什么静态构造函数中的异常包装在TypeInitializationException中

本文关键字:包装 TypeInitializationException 异常 静态 构造函数 为什么 | 更新日期: 2023-09-27 17:51:06

来自静态构造函数的异常被封装在TypeInitializationException中。考虑下面的例子

using System;
namespace ConsoleApp
{
class Program
{
    static void Main(string[] args)
    {
        try
        {
            new MyClass();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.GetType().ToString());
        }
    }
    public class MyClass
    {
        static MyClass()
        {
            throw new Exception();
        }
    }
}
}

程序输出为

System.TypeInitializationException
    在TypeInitializationException中包装异常的原因是什么?
  1. 为什么没有返回原来的异常?

为什么静态构造函数中的异常包装在TypeInitializationException中

在TypeInitializationException中包装异常的原因是什么?

静态构造函数中的

异常很难处理。基本问题是异常的执行上下文非常模糊。当构造函数运行时,CLI并没有给出任何具体的承诺。唯一可以保证的是它会足够快地运行,具体运行时间还没有确定。

因此,没有包装异常的世界末日场景是,您从用户那里得到一个模糊的错误报告,例如"当我单击Save按钮时,我得到一个NullReferenceException"。您将研究您的SaveButton_Click()事件处理程序,但无论您多么努力地寻找,您都不会找到该异常的好理由。它发生在远离事件处理程序方法的代码中,代码在不可预测的时间运行。

通过在TypeInitializationException中包装它,你就知道在哪里查找了。

为什么没有返回原来的异常?

如果返回,它将是TIE的InnerException。忘记看它是一个标准的疏忽。如果你曾经写过try/catch代码,那么永远不要犯只显示你捕获的异常的Message属性的错误。InnerException也很重要。强烈建议显示由异常对象的ToString()方法生成的字符串。这对用户来说很繁琐,但对你来说很重要。避免使用日志记录或隐藏可以使用" details &quot显示的细节。

静态构造函数是在初始化时调用的,所以虽然是静态构造函数出错了,但是是类型初始化器在调用,所以这就是你得到的异常https://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx