catch another process unhandled exception

20,568

Solution 1

If you are calling to a .Net executable assembly you can load it and (at your own risk :D ) call to the Main method of the Program class into a try_catch statement:

Assembly assembly = Assembly.LoadFrom("ErroneusApp.exe");
Type[] types= assembly.GetTypes();
foreach (Type t in types)
{
 MethodInfo method = t.GetMethod("Main",
     BindingFlags.Static | BindingFlags.NonPublic);
 if (method != null)
 {
    try
    {
        method.Invoke(null, null);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
    break;
 }
}

But be aware of the security risks you are introducing doing that.

Solution 2

You can try something like that to avoid the debugger question to appear, you won't get the exception but only the exit code:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            ProcessStartInfo info = 
                 new ProcessStartInfo("ErroneusApp.exe");
            info.ErrorDialog = false;
            info.RedirectStandardError = true;
            info.RedirectStandardOutput = true;
            info.CreateNoWindow = true;
            info.UseShellExecute = false;

            System.Diagnostics.Process p = 
                System.Diagnostics.Process.Start(info);
            p.EnableRaisingEvents = true;
            p.Exited += p_Exited;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadLine();
    }


    static void p_Exited(object sender, EventArgs e)
    {
        Process p = sender as Process;
        if (p != null)
        {
            Console.WriteLine("Exited with code:{0} ", p.ExitCode);
        }
        else
            Console.WriteLine("exited");
    }

}

In this question they provided another workaround for that, but changing some registry values.

Solution 3

No. If the controlled app utilizes standardError and return codes you may be notified of the occurance of an error or exception but you cannot trap it in any way.

Solution 4

Instead of doing the whole sneaking around the assembly to try to find the Main method like in jmservera's answer, you can simply execute the assembly in a new domain. See this msdn article

Share:
20,568
Ahmad Hajou
Author by

Ahmad Hajou

Software developer in the Market Research industry. Focus on C#, and Javascript.

Updated on July 09, 2022

Comments

  • Ahmad Hajou
    Ahmad Hajou almost 2 years

    I wish to know if i can catch the unhandled exceptions thrown by another process which I started using the Process.Start(...)

    I know i can catch the standered error using this link , but what I want is to catch the error that are usually caught by the Just In Time debugger of the.net environment, the window with the following words: "An unhandled exception has occurred in your application . If you Continue, the application will ignore this error and attempt to continue . If you click Quit, the application will be shut down immediately ...." Which is then followed by the exception message and a "Continue" and "Quit" button.

  • Ahmad Hajou
    Ahmad Hajou about 14 years
    I don't think this is what I am looking for 10x for the help anyway
  • Ahmad Hajou
    Ahmad Hajou about 14 years
    I think this is the exact answer I'm currently looking for Thank you very sir. P.S. in my implementation, i think im going to add the newly loaded assembly to a new AppDomain.
  • Ahmad Hajou
    Ahmad Hajou about 14 years
    I gotta ask here, is there a way to find out if the exe is a .net executable assembly? what if the application is under .net 2.0 while the other is 3.5, will that matter?
  • Kathir Subramaniam
    Kathir Subramaniam almost 8 years
    I tried to invoke the constructor using GetConstructor() method. But it is not working for me. Could you please share an idea or sample code to achieve this?
  • Kiquenet
    Kiquenet about 5 years
    How Call for a BAT script in UNC folder ?