有一个可执行文件,我在program.cs
中的解决方案的开头抛出了一个异常。当使用CreateProcessA()
从不同的解决方案加载此可执行文件时,我看到进程加载并且没有给予我错误消息。如何捕获此异常?
STARTUPINFOA startupInfo;
PROCESS_INFORMATION pi;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
ZeroMemory(&pi, sizeof(pi));
const auto dwCreationFlags = showConsole ? CREATE_NEW_CONSOLE : CREATE_NO_WINDOW;
auto canCreate = true;
if (!CreateProcessA(
nullptr, // LPCWSTR IpApplicationName
const_cast<LPSTR>(command.c_str()), // LPSTR IpCommandLine
nullptr, // LPSECURITY_ATTRIBUTES IpProcessAttributes
nullptr, // LPSECURITY_ATTRIBUTES IpThreadAttributes
false, // BOOL bInheritHandles,
dwCreationFlags, // DWORD dwCreationFlags
nullptr, // LPVOID IpEnvironment
nullptr, // LPCWSTR IpCurrentDirectory
&startupInfo, // LPSTARTUPINFOW IpStartupInfo
&pi // LPPROCESS_INFORMATION IpProcessInformation
))
{
canCreate = false;
return Status(WinUtil::GetLastErrorMessage());
}
//canCreate = false;
// Wait until child process exits.
WaitForSingleObject(pi.hProcess, 0);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return Status();
我希望它返回false并捕获异常。
然而,它现在会循环一段时间,然后抛出一个通用消息,说它启动失败。它没有捕获我在解决方案开始时抛出的异常。
1条答案
按热度按时间yhxst69z1#
你不能跨语言边界抛出异常,更不用说跨进程边界了。一个C应用程序不能捕获在一个单独的C#应用程序中抛出的异常。
当C#应用程序抛出一个没有被捕获的异常时,它将简单地终止自己。启动它的C应用程序无法捕获该未捕获的异常。它唯一能做的就是等待C#应用程序终止(您已经在这样做了),然后使用
GetExitCodeProcess()
获取退出代码,它在意外失败时将为非零(例如,对于未捕获的托管异常为0xE0434352
,对于访问冲突为0xC0000005
,对于堆栈溢出为0xC00000FD
,等等)。参见:Exit Code When Unhandled Exception Terminates Execution?