更新:我已在 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/