c# - 无法捕获的异常,第 2 部分

标签 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();
    }
}

二。在其他地方创建指向此方法的 MethodInfo:

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

三。在 try/catch block 中包装对 Invoke() 的调用:

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

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

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

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

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

最佳答案

我可以在我的 .NET 4 机器上重现它,你是对的——它只发生在 .NET 4.0 上。

这对我来说非常像一个错误,应该继续使用 MS Connect。 Major 如果这会触发您的崩溃处理程序,那就太糟糕了。解决这个问题的一种不太令人愉快的方法是将调用的方法包装在它自己的处理程序中。 :-(

不过,有一件事我无法重现,那就是触发崩溃处理程序。这是我的程序:

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!");
        }
    }
}

关于c# - 无法捕获的异常,第 2 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3057822/

相关文章:

c# - wcf get 方法 - 如何绑定(bind)到 View 模型?

c# - 我可以使用 Serilog 登录到单独的文件吗?

c# - DataReaders,慢速客户端是否会导致连接数超过最大连接数

java - 如何方便地包装对调用者敏感的 API?

c++ - C++11标准有没有全新的序列化和反射库?

c# - 为什么在 C# 应用程序中将 IL 代码打包到 exe 中?

C# 扩展方法返回值不设置变量

go - 使用反射动态将结构字段设置为 slice 值

c# - 对于 64 位架构上的算术,.NET 是否将 Int32 提升为 Int64?

sql-server - 在 SQL CLR 程序集中配置远程数据库连接字符串