如何从C#处理非托管Win32异常

时间:2015-01-15 10:18:17

标签: c# c++ exception exception-handling

大家好我想弄清楚是否有可能捕获(或至少抑制)托管代码中的各种非托管异常?我已经在这里看到了很多问题,但对我来说仍然不清楚,哪些类型的异常是可捕捉的,哪些不是?

就像一个例子,我做了一个C ++程序,它执行除零:

printf("Hello from unmanaged code\n");
int a = 0;
printf("%d\n", 10 / a);
return 0;

和C#应用程序

        try
        {
            Process p = new Process();
            p.StartInfo.FileName = "test.exe";
            p.Start();
            p.WaitForExit();
            Console.WriteLine("success");
        }
        catch (Win32Exception)
        {
            Console.WriteLine("1");
        }
        catch(ExternalException)
        {
            Console.WriteLine("2");
        }
        catch
        {
            Console.WriteLine("3");
        }

这里没有任何捕获没有触发,程序终止窗口出现,关闭后,C#programm继续正常执行。

2 个答案:

答案 0 :(得分:2)

无论使用何种语言或catch-block,都无法处理来自不同进程的异常

答案 1 :(得分:0)

正如nvoigt所提到的,在这种情况下你无法处理异常。对于这种情况,更合适的解决方案是从C ++代码读取返回的值。例如 :     if(a!= 0)返回1; 然后在你的C#代码中处理它,如:    if(p.ExitCode == 1)Console.WriteLine("除以零");