让程序优雅的崩溃

软件运行过程中出现异常导致崩溃,这是无法避免的。毕竟不是每一个开发人员都能考虑到任何使用情况,何况Windows还会蓝屏呢,呵呵!
默认情况下,软件崩溃会弹出Windows或者其他系统的错误提示框,表示进程异常结束,这种提示往往会让人觉得不够友好,毕竟软件崩溃对于用户来说是一种非常不好的体验。
那么什么是让软件优雅的崩溃呢?
我们可以在软件中实现,当软件运行获取到异常后,弹出预先做好的友好的提示框,同时做一些搜集动作,如软件的日志或者崩溃信息等。

本文介绍的是在Windows下如何实现软件的优雅崩溃

一、首先要包含对应的头文件

1
2
3
#include <Windows.h>
#include <DbgHelp.h>
#include <Errhandlingapi.h>

二、实现异常注册函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
LONG ApplicationCrashHandler(EXCEPTION_POINTERS *pException)
{
//创建 Dump 文件
HANDLE hDumpFile = CreateFile(L"crash.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDumpFile != INVALID_HANDLE_VALUE)
{
//Dump信息
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;

//写入Dump文件内容
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpValidTypeFlags, &dumpInfo, NULL, NULL);

CloseHandle(hDumpFile);
}

//! start messagebox
//! show_crash_window.exe为自定义弹窗
bool bStarted = QProcess::startDetached("show_crash_window.exe", QStringList());
return EXCEPTION_EXECUTE_HANDLER;//这个返回值是告诉系统已经处理异常,这样就不会弹出系统的提示窗了
}

三、在main函数里注册异常

1
2
3
4
5
6
int main(int argc, char* argv[])
{
//!注册异常函数
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);
return 0;
}
lasyman wechat
-------------本文结束感谢您的阅读-------------