pt 2,无法捕捉的例外
更新:我已经在Microsoft Connect上提交了错误报告: https : //connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#details
如果您可以在您的计算机上重现此问题,请提供该错误以便修复它!
好的,我已经做了一些测试,我把问题简化为非常简单的事情:
一世。 在抛出exception的新类中创建方法:
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。现在使用调试器运行程序。 发生exception时,调试器将暂停程序,即使它包含在试图忽略它的catch处理程序中。 (即使你在catch块中放置了一个断点,它会在它到达之前停止!)
实际上,在没有调试器的情况下运行它时会发生exception。 在一个简单的测试项目中,它在某个其他级别被忽略,但如果您的应用程序有任何类型的全局exception处理,它也会在那里被触发。 [看评论]
这让我很头疼,因为它不断触发我的应用程序的崩溃处理程序,更不用说尝试调试的痛苦了。
我可以在我的.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!"); } } }
你无法捕捉到所有exception。 您的示例中有一些假设。 例如,您假设在调用线程上引发了exception。 在其他线程上捕获未处理的exception取决于您正在使用的运行时(控制台,winforms,WPF,ASP.Net等)。
此外,对System.Environment.FailFast()的调用不会生成任何可处理的条件 – 该过程实际上已终止,无法进行干预。