22

更新:我已经提交了关于 Microsoft Connect 的错误报告:https ://connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-throw-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. 在没有调试器的情况下运行程序(工作正常)。

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

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

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

4

2 回答 2

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!");
        }
    }
}
于 2010-06-16T23:35:52.360 回答
-1

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

此外,对 System.Environment.FailFast() 的调用不会产生任何可处理的条件 - 进程被有效地终止,没有机会进行干预。

于 2010-06-16T23:34:52.613 回答