Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The uncatchable exception, pt 2

Tags:

Update: I've filed a bug report on Microsoft Connect: https://connect.microsoft.com/VisualStudio/feedback/details/568271/debugger-halting-on-exception-thrown-inside-methodinfo-invoke#details

If you can reproduce this problem on your machine, please upvote the bug so it can be fixed!


Ok I've done some testing and I've reduced the problem to something very simple:

i. Create a method in a new class that throws an exception:

public class Class1 {     public void CallMe() {         string blah = null;         blah.ToLower();     } } 

ii. Create a MethodInfo that points to this method somewhere else:

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

iii. Wrap a call to Invoke() in a try/catch block:

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

iv. Run the program without the debugger (works fine).

v. Now run the program with the debugger. The debugger will halt the program when the exception occurs, even though it's wrapped in a catch handler that tries to ignore it. (Even if you put a breakpoint in the catch block it will halt before it reaches it!)

In fact, the exception is happening when you run it without the debugger too. In a simple test project it's getting ignored at some other level, but if your app has any kind of global exception handling, it will get triggered there as well. [see comments]

This is causing me a real headache because it keeps triggering my app's crash-handler, not to mention the pain it is to attempt to debug.

like image 263
devios1 Avatar asked Jun 16 '10 23:06

devios1


1 Answers

I can reproduce this on my .NET 4 box, and you're right -- it only happens on .NET 4.0.

This smells very much like a bug to me, and should go on MS Connect. Major bummer if this is tripping your crash handler. Sounds like a non-pleasing way to work around this is to wrap the invoked method inside its own handler. :-(

One thing I can not reproduce, though, is tripping the crash handler. Here's my program:

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!");         }     } } 
like image 132
Dave Markle Avatar answered Oct 05 '22 00:10

Dave Markle