为什么静态构造函数中的异常包装在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中包装异常的原因是什么?
- 为什么没有返回原来的异常?
静态构造函数中的在TypeInitializationException中包装异常的原因是什么?
异常很难处理。基本问题是异常的执行上下文非常模糊。当构造函数运行时,CLI并没有给出任何具体的承诺。唯一可以保证的是它会足够快地运行,具体运行时间还没有确定。
因此,没有包装异常的世界末日场景是,您从用户那里得到一个模糊的错误报告,例如"当我单击Save按钮时,我得到一个NullReferenceException"。您将研究您的SaveButton_Click()事件处理程序,但无论您多么努力地寻找,您都不会找到该异常的好理由。它发生在远离事件处理程序方法的代码中,代码在不可预测的时间运行。
通过在TypeInitializationException中包装它,你就知道在哪里查找了。
为什么没有返回原来的异常?
如果返回,它将是TIE的InnerException。忘记看它是一个标准的疏忽。如果你曾经写过try/catch代码,那么永远不要犯只显示你捕获的异常的Message属性的错误。InnerException也很重要。强烈建议显示由异常对象的ToString()方法生成的字符串。这对用户来说很繁琐,但对你来说很重要。避免使用日志记录或隐藏可以使用" details "显示的细节。
静态构造函数是在初始化时调用的,所以虽然是静态构造函数出错了,但是是类型初始化器在调用,所以这就是你得到的异常https://msdn.microsoft.com/en-us/library/k9x6w0hc.aspx