pt 2,无法捕捉的例外

时间:2010-06-16 23:06:56

标签: c# reflection clr invoke methodinfo

更新:我已在Microsoft Connect上提交了错误报告:https://connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#details

如果您可以在您的计算机上重现此问题,请提供该错误以便修复它!


好的,我已经做了一些测试,我把问题简化为非常简单的事情:

我。在抛出异常的新类中创建方法:

public class Class1 {
    public void CallMe() {
        string blah = null;
        blah.ToLower();
    }
}

II。创建一个指向此方法的MethodInfo:

Type class1 = typeof( Class1 );
Class1 obj = new Class1();
MethodInfo method = class1.GetMethod( "CallMe" );

III。在try / catch块中包含对Invoke()的调用:

try {
    method.Invoke( obj, null ); // exception is not being caught!
} catch {
}

IV。不使用调试器运行程序(工作正常)。

诉现在使用调试器运行程序。发生异常时,调试器将暂停程序,即使它包含在试图忽略它的catch处理程序中。 (即使你在catch块中放置一个断点,它也会在它到达之前停止!)

实际上,在没有调试器的情况下运行它时会发生异常。在一个简单的测试项目中,它在某个其他级别被忽略,但是如果你的应用程序有任何类型的全局异常处理,它也会在那里被触发。 [参见注释]

这让我很头疼,因为它一直触发我的应用程序的崩溃处理程序,更不用说尝试调试的痛苦了。

2 个答案:

答案 0 :(得分:5)

我可以在我的.NET 4机器上重现这一点,你说得对 - 它只发生在.NET 4.0上。

这对我来说非常像臭虫,应该继续使用MS Connect。如果这是绊倒您的崩溃处理程序,那么主要更糟糕。听起来像解决这个问题的一种不愉快的方法是将调用的方法包装在自己的处理程序中。 : - (

但是,我无法重现的一件事是绊倒崩溃处理程序。这是我的计划:

namespace trash {
    public class Class1 {
        public void CallMe() {
            string blah = null;
            blah.ToLower();
        }
    }

    class Program {
        static void Main(string[] args) {
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);           
            var class1 = typeof(Class1);
            var method = class1.GetMethod("CallMe");

            try {
                var obj = new Class1();
                method.Invoke(obj, null); // exception is not being caught!
            }
            catch (System.Reflection.TargetInvocationException) {
                Console.Write("what you would expect");
            }

        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {
            Console.Write("it would be horrible if this got tripped but it doesn't!");
        }
    }
}

答案 1 :(得分:-1)

你无法捕捉所有异常。您的示例中有一些假设。例如,您假设在调用线程上引发了异常。在其他线程上捕获未处理的异常取决于您正在使用的运行时(控制台,winforms,WPF,ASP.Net等)。

此外,对System.Environment.FailFast()的调用不会生成任何可处理的条件 - 该过程实际上已终止,无法进行干预。