代码之家  ›  专栏  ›  技术社区  ›  devios1

不可修补的异常,pt 2

  •  22
  • devios1  · 技术社区  · 15 年前

    我已经提交了一份关于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();
        }
    }
    

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

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

    iv.在没有调试器的情况下运行程序(工作正常)。

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

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

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

    2 回复  |  直到 14 年前
        1
  •  5
  •   Dave Markle    15 年前

    我可以在我的.NET4盒子上复制这个,你说得对——它只发生在.NET4.0上。

    这闻起来很像一个虫子,我应该继续MS连接。 少校 如果这是绊倒你的崩溃处理程序。听起来解决这个问题的一个不好的方法是将调用的方法包装在自己的处理程序中-(

    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!");
            }
        }
    }
    
        2
  •  -1
  •   Nathan Ernst    15 年前

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