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

时间:2015-05-29 17:48:27

标签: c# static

静态构造函数的异常包含在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
  1. 在TypeInitializationException中包装异常的原因是什么?
  2. 为什么不返回原始异常?

2 个答案:

答案 0 :(得分:5)

  

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

静态构造函数中的异常很难。基本问题是异常的执行上下文非常模糊。 CLI在构造函数运行时没有给出任何具体的承诺。唯一的保证就是它会很快运行,多久没有说明。

因此,没有异常被包装的一个世界末日场景是你从用户那里得到一个模糊的错误报告,例如“当我点击Save按钮时我得到一个NullReferenceException”。你将研究你的SaveButton_Click()事件处理程序,但是你看起来不难,你永远找不到这个例外的好理由。它出现在远离事件处理程序方法的代码中,代码在不可预测的时间运行。

通过将其包装在TypeInitializationException中,您将知道要查找的位置。

  

为什么不返回原始异常?

返回 ,它将是TIE的InnerException。忘记看它是标准的疏忽。如果您曾经编写过try / catch代码,那么永远不会错误地只显示您捕获的异常的Message属性。 InnerException也很重要。非常希望显示异常对象的ToString()方法生成的字符串。它对用户来说很棒,但对你来说很重要。使用错误对话框中的“详细信息”按钮可以显示的日志记录或隐藏详细信息,避免狼吞虎咽。

答案 1 :(得分:1)

静态构造函数在初始化时被调用,所以虽然它是你的静态构造函数失败,但它是调用 的类型initalizer,所以这是你获得的异常:https://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx