【问题标题】:How to handle unmanaged Win32 exception from C#如何处理来自 C# 的非托管 Win32 异常
【发布时间】:2015-01-15 10:18:17
【问题描述】:

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

作为一个例子,我制作了一个执行被零除的 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");
        }

这里的catch都没有触发,出现程序终止窗口,关闭后C#程序继续正常执行。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 是的,而且C++程序负责捕捉并报告自己的异常,不指望其他进程来做。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 2014-07-09
      • 2011-10-14
      • 2011-05-21
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多