C++;程序退出,代码为0错误 我多年来第一次做C++工作,我正在努力解决问题。我编写了一些代码,这些代码会列出机器上运行的进程,并返回性能指标。我的问题是发生了某种未经处理的错误,在调试窗口中,我收到一条消息说程序已退出,代码为0。下面是main函数中的代码 int _tmain(int argc, _TCHAR* argv[]) { while(nRun == 1) { try { WriteHeartBeat(); DoProcessLoop(dwTotalRAM, nCheckPause, oPMeter, cFileName, oProcess, oCPUUsage, nProcCount, ddsCaps2, lpDD); CopyPerfFileToDest(cFileName); nRun = 1; tEnd = time(NULL); }catch(...){ AddToLog("Error in Main Function"); } } AddToLog("App Stopped"); return 0; }

C++;程序退出,代码为0错误 我多年来第一次做C++工作,我正在努力解决问题。我编写了一些代码,这些代码会列出机器上运行的进程,并返回性能指标。我的问题是发生了某种未经处理的错误,在调试窗口中,我收到一条消息说程序已退出,代码为0。下面是main函数中的代码 int _tmain(int argc, _TCHAR* argv[]) { while(nRun == 1) { try { WriteHeartBeat(); DoProcessLoop(dwTotalRAM, nCheckPause, oPMeter, cFileName, oProcess, oCPUUsage, nProcCount, ddsCaps2, lpDD); CopyPerfFileToDest(cFileName); nRun = 1; tEnd = time(NULL); }catch(...){ AddToLog("Error in Main Function"); } } AddToLog("App Stopped"); return 0; },c++,C++,该程序运行了很长一段时间,但过了一段时间,它返回时说它退出了,代码为0,但“App Stopped”行从未打印到日志中。有人知道我可能会犯什么样的错误,或者会发生什么问题吗?try-catch块是否足以捕获可能发生的任何错误,或者我是否可以执行其他操作。如果您能提供任何帮助,我们将不胜感激 编辑:如果日志文件正确退出,它应该从这里获得3个条目。它们是“DoProcessLoop”函数的“DoingProcessLoop”,是“CopyPerfFileToDest”函数的“复制文件”,是“apps

该程序运行了很长一段时间,但过了一段时间,它返回时说它退出了,代码为0,但“App Stopped”行从未打印到日志中。有人知道我可能会犯什么样的错误,或者会发生什么问题吗?try-catch块是否足以捕获可能发生的任何错误,或者我是否可以执行其他操作。如果您能提供任何帮助,我们将不胜感激


编辑:如果日志文件正确退出,它应该从这里获得3个条目。它们是“DoProcessLoop”函数的“DoingProcessLoop”,是“CopyPerfFileToDest”函数的“复制文件”,是“appstopped”,如果它正确停止的话。当我自己让它正确停止时,我得到所有3行,当它错误停止时,我只在日志中得到“Doing Process Loop”,然后它以代码0退出。错误一定在那里。我很好奇是否有一个通用的错误陷阱可以捕获所有的错误。

如果从调用的函数之一调用exit(0),就会发生这种情况:


有时文件未正确刷新,因此如果AddToLog函数在退出之前延迟写入文件,则可能不会写入值。您可以调试程序以查看是否发生了奇怪的情况,或者添加一个变量(如status)并在catch函数中设置它,然后在末尾返回它,这样您就可以根据值判断是否存在错误。

尝试使用布尔值和周围的add to log更改addtolog的返回:

boolean logged=false;
while(!logged){
  logged = AddToLog("App Stopped");
}

这将防止程序在写入“App Stopped”之前退出,这可能是问题所在。

此代码并没有真正显示出可能出现的错误,其中有三个函数可能会发生错误,但我们看不到它们。如果它退出时出现错误代码0,则表示它正常退出,Fyiar您确定AddToLog使用刷新写入日志吗?否则,您可能会在底部退出而看不到日志行。如果日志文件正确退出,则应该从这里获得3个条目。它们是“DoProcessLoop”函数的“DoingProcessLoop”,是“CopyPerfFileToDest”函数的“复制文件”,是“appstopped”,如果它正确停止的话。当我自己让它正确停止时,我得到所有3行,当它错误停止时,我只在日志中得到“Doing Process Loop”,然后它以代码0退出。错误一定在那里。我很好奇是否有一个通用的错误陷阱可以捕获所有的错误。当我自己正确地退出程序时,我会在日志中得到我需要的所有正确的行。当程序自行退出时,我会得到所需的3行中的1行。“CopyPerfFileToDest”函数也应该写入它内部的日志,但它在意外退出时不会写入。是的,这就是缓存刷新问题,如果程序意外死亡,则日志记录器有未写入的语句。有时我只是写信给stderr来绕过记录器上的缓存。C库函数的手册页可以提供关于如何使用它们的令人惊讶的信息。例如,打开的手册页指出操作是原子的,因此我可以用于锁。从main返回0与退出(0)相同;main有效退出(main(args));