Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法从Activator.CreateInstance捕获异常_C#_.net_Exception Handling_Activator - Fatal编程技术网

C# 无法从Activator.CreateInstance捕获异常

C# 无法从Activator.CreateInstance捕获异常,c#,.net,exception-handling,activator,C#,.net,Exception Handling,Activator,好吧,我承认这段代码在你看来很奇怪,那是因为它很奇怪。这只是复制行为的代码,而不是我想要使用的代码 class Program { static void Main(string[] args) { try { Activator.CreateInstance(typeof(Func<int>), new object[] { new object(), IntPtr.Zero }); }

好吧,我承认这段代码在你看来很奇怪,那是因为它很奇怪。这只是复制行为的代码,而不是我想要使用的代码

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Activator.CreateInstance(typeof(Func<int>), new object[] { new object(), IntPtr.Zero });
        }
        catch
        {
            Console.WriteLine("This won't print!");
        }

        Console.Write("Actually this will not print either!");
        Console.ReadLine();
    }
}
类程序
{
静态void Main(字符串[]参数)
{
尝试
{
CreateInstance(typeof(Func),新对象[]{new object(),IntPtr.Zero});
}
抓住
{
WriteLine(“这不会打印!”);
}
编写(“实际上这也不会打印!”);
Console.ReadLine();
}
}

无论我试图捕获何种异常类型(据我所知,实际抛出的异常是ArgumentException),catch块内的代码都不会执行。实际上,执行将在Activator.CreateInstance行停止。

当我在.NET 3.5中运行此代码时,我得到一个
ExecutionEngineeException
。当运行时抛出此异常时,类似于调用
Environment.FailFast
。显然,这是堆内存损坏的症状

当我将示例代码切换到以下代码时,就实现了正确的行为

Activator.CreateInstance(
    typeof(Func<int>), 
    new object[] { IntPtr.Zero, new object() }
);
Activator.CreateInstance(
类型(Func),
新对象[]{IntPtr.Zero,new object()}
);

我很清楚,这带来的问题比答案多……:)

你用这段代码轰炸了CLR。给人印象深刻的实际的灾难是垃圾收集堆的损坏,它会发出ExecutionEngineeException信号。显然,损害的程度足以阻止CLR执行异常处理程序


您可以在connect.microsoft.com上报告此情况。然而,这个错误在.NET4.0中已经修复,它生成了正确的异常ArgumentNullException,“Value不能为null,Parameter name:method”。解决方法很明显,当IntPtr.Zero需要一个非空字符串时,不要传递它。

只有在构造委托时才会发生这种情况吗?你应该使用
Delegate.CreateDelegate
来实现这一点。这可能只发生在构造委托时,但实际使用的代码不知道它试图创建的是什么类型,现在的修复方法是它是“禁止的”即使类型继承自委托,也要尝试。我根本无法捕获异常并检查它,您有什么设置来实现此目的?@Patrik-您正在运行.NET的哪个版本?@Patrik-您可能想查看在调试->异常下设置的选项。@chaosption,是的,我检查了“抛出”适用于所有类型的异常,但无论如何都不会中断。不确定我是否遗漏了其他设置???@Patrik-这只是一个理论,但请尝试将
(Exception ex)
添加到您的
catch
子句中。