如何处理来自 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");
大家好,我想弄清楚是否有可能在托管代码中捕获(或至少抑制)所有类型的非托管异常?我已经在这里看到了很多问题,但我仍然不清楚,哪些类型的异常是可捕获的,哪些不是?
举个例子,我编写了一个执行除零的 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");