我有一个应用程序,有时会导致异常。如果崩溃,我需要重新启动它。但问题是,我在这里有Windows 7,当应用程序崩溃时,Windows会向我显示一个很好的对话框,其中包含关闭应用程序的建议。但是应用程序本身仍在运行,直到我单击“关闭”。如何摆脱这个窗口,使应用程序立即终止,没有任何对话框?
答案 0 :(得分:13)
理想情况下,您会在程序的最外层范围内捕获所有异常。但是,有时您无法进行此类更改,并且崩溃对话框会阻止您从崩溃中恢复。在这些情况下,您可以考虑完全禁用Windows Error Reporting,也可以考虑禁用特定程序。
在Windows 7上:启动Orb - >控制面板 - >行动中心 - >维护 - >检查问题报告的解决方案 - >设置
更新:完全禁用错误报告UI更改DontShowUI注册表设置:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ Windows错误报告\ DontShowUI
答案 1 :(得分:1)
您可以使用Dr Watson的概念来检测崩溃并重新启动应用程序。使用以下内容:
设置如下的定时器:
SetTimer( eIsDwwin, 30000, NULL);
这将在系统进程中每隔30秒使用以下内容检查Dr Watson进程:
void CMainFrame::OnTimer(UINT nIDEvent) {
case eIsDwwin:
HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
DWORD dwsma = GetLastError();
DWORD dwExitCode = 0;
PROCESSENTRY32 procEntry={0};
procEntry.dwSize = sizeof( PROCESSENTRY32 );
Process32First(hndl,&procEntry);
do {
if(((!strcmpi(procEntry.szExeFile,"dwwin.exe"))||
(!strcmpi(procEntry.szExeFile,"drwatson.exe"))||
(!strcmpi(procEntry.szExeFile,"drwtsn32.exe"))||
(!strcmpi(procEntry.szExeFile,"WerFault.exe"))) &&
(procEntry.th32ParentProcessID == GetCurrentProcessId())) {
WSACleanup();
PostMessage( WM_CLOSE);
Sleep(500);
if(0==strcmpi(procEntry.szExeFile,"dwwin.exe")) {
system("TASKKILL /IM dwwin.exe /F");
} else if(0==strcmpi(procEntry.szExeFile,"drwatson.exe")) {
system("TASKKILL /IM drwatson.exe /F");
} else if(0==strcmpi(procEntry.szExeFile,"drwtsn32.exe")) {
system("TASKKILL /IM drwtsn32.exe /F");
} else if(0==strcmpi(procEntry.szExeFile,"WerFault.exe")) {
system("TASKKILL /IM WerFault.exe /F");
} else {
system("TASKKILL /IM WerFault.exe /F");
}
break;
}
} while(Process32Next(hndl,&procEntry));
CloseHandle(hndl);
break;
}
}
这将关闭已经崩溃的应用程序。
另一种方法是使用Windows中的Signal API来处理异常和崩溃。
答案 2 :(得分:0)
不知道应用程序的语言会让它变得有点困难,但通常可以通过在try / catch块(如C#,C ++或Python)中运行应用程序来处理它。在伪Csharp-ish代码中:
bool done = false;
main()
{
while( !done )
{
AppClass aclass = new AppClass();
try
{
aclass->Run();
}
catch( Exception x )
{
LogErrorSomehow(x);
delete aclass;
continue;
}
}
}
基本上,解决“未处理异常”错误的最佳方法是通过捕获异常并采取适当的操作来处理异常(即使该操作无效)。
在此示例中,如果有人想关闭您的应用,您可以将“完成”值设置为true并从Run()返回。