如何处理来自 C# 的非托管 Win32 异常

How to handle unmanaged Win32 exception from C#

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

举个例子,我编写了一个执行除零的 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");
        }

None 这里的捕获没有触发,程序终止 window 出现,关闭后,C# 程序继续正常执行。

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

如 nvoigt 所述,您无法在这种情况下处理异常。更适合这种情况的解决方案是从 C++ 代码中读取 returned 值。例如 : 如果 (a != 0) return 1; 然后在您的 C# 代码中处理它,例如: 如果 (p.ExitCode == 1) Console.WriteLine("division by zero");