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

rob*_*r78 2 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();
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出是

System.TypeInitializationException
Run Code Online (Sandbox Code Playgroud)
  1. 在TypeInitializationException中包装异常的原因是什么?
  2. 为什么没有返回原始异常?

Han*_*ant 5

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

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

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

通过将其包装在TypeInitializationException中,您将知道在哪里查看.

为什么没有返回原始异常?

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