来自静态构造函数的异常被包装在 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 中的原因是什么?
- 为什么没有返回原来的异常?
最佳答案
What are the reasons for wrapping the exception in a TypeInitializationException ?
静态构造函数中的异常是困难的。基本问题是异常的执行上下文非常模糊。当构造函数运行时,CLI 不会给出任何具体的 promise 。唯一的保证是它会很快运行,具体多快未指定。
因此,没有异常被包装的世界末日场景是您从用户那里得到一个模糊的错误报告,例如“当我单击“保存”按钮时,我得到了一个 NullReferenceException”。您将研究您的 SaveButton_Click() 事件处理程序,但无论您多么努力地寻找,您都永远找不到该异常的充分理由。它发生在远离事件处理程序方法的代码中,代码在不可预测的时间运行。
通过将其包装在 TypeInitializationException 中,您将知道要查找的位置。
Why is the original exception not returned ?
它被返回,它将是TIE的InnerException。忘记看它是一种标准的疏忽。如果您曾经编写过 try/catch 代码,那么永远不要犯只显示您捕获的异常的 Message 属性的错误。 InnerException 也很重要。强烈支持显示由异常对象的 ToString() 方法生成的字符串。它对用户来说是天方夜谭,但对您来说却是必不可少的。避免使用错误对话框中的“详细信息”按钮显示的日志记录或隐藏细节。
关于c# - 为什么静态构造函数中的异常包装在 TypeInitializationException 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30535975/