1. 程式人生 > >【異常處理】MFC程式崩潰的友好處理

【異常處理】MFC程式崩潰的友好處理

軟體總存在這樣或者那樣的bug。

雖然測試員已經在很努力的尋找問題,程式設計師也在汗流浹背的除蟲,但是總會有一些情況被遺漏或者不可預測,比如使用者的硬體環境、網路狀況、作業系統差異等等,不一而足。而導致的結果則是彈出下面這樣一個讓使用者摸不著頭腦又惱火的提示,然後崩潰掉,令程式設計師尷尬不已。

image 

而在一些成熟的軟體產品中,程式崩潰時我們看到的卻是另外一番畫面,比如QQ:

image 

又比如迅雷:

image

你也想讓你的程式擁有友好的崩潰介面,降低使用者生氣的能量,並且收集一些必要的資訊進行除錯,來完善你的程式嗎?如果你是MFC程式猿,請繼續圍觀,其他猿類請自行無視,並尋找適合你的猿糞。

其實MFC框架已經為我們考慮到這個問題,只是預設生成的應用程式框架沒有包含進去而已。實現這個功能的核心是函式:SetUnhandledExceptionFilter

,想要了解這個函式的同學請查閱MSDN,這裡就不再贅述他的用法。本著複用主意的精神,本文介紹的內容來自於大家所熟悉的電驢(emule)的原始碼,電驢實現了上面那樣的功能,我只是把程式碼從電驢裡拿出來加到自己的程式裡然後到這裡分享給你。

毫無疑問,電驢是一款優秀的軟體,並且在它華麗的外表下還有一副強壯的身體。它的程式碼有非常優秀。它是基於MFC開發的開源程式,需要原始碼的同學請猛擊這裡下載。

image

上面這幅圖就是電驢的原始碼包,我們要用到的就是那個被我選中的“CrashReporter”,它是一個獨立的工程,我們只需要根據需要做一些修改然後直接編譯即可。

另外我們還需要位於srcWorkLayer目錄下的mdump.h和mdump.cpp,把這兩個檔案拷貝並加到你的工程裡,然後把mdump.cpp裡的下面這行去掉:

#include “CheckConflict.h”    //ADDED by fengwen on 2006/12/25    : 檢測已知的第三方軟體衝突。

這個是用於檢測已知的會和電驢衝突的軟體,不再本文討論之列,有興趣的同學請自行研究。另外把TopLevelFilter函式裡的下面幾行也刪掉:

try
{
    //ADDED by fengwen on 2006/12/25    <begin> :    檢測第三方軟體衝突。
    CCheckConflict    cc;
    if (cc.CheckConflict(pExceptionInfo))
    {
        ExitProcess(1);
    }
    //ADDED by fengwen on 2006/12/25    <end> :    檢測第三方軟體衝突。
}
catch(…)
{
}

最後一步,在主程式框架類裡新增:

#include “mdump.h”

再到InitInstance函式裡新增下面的程式碼:

theCrashDumper.Enable(_T(“YourApp 1.0″), false);

好了,大功告成,現在編譯你的程式,在合適的地方增加測試程式碼就可以實驗效果了。比如下面這兩行程式碼會讓你的程式立即崩潰:

int n = 0;
int m = 10/n;

怎麼樣,效果還不錯吧?這個程式除了攔截程序異常,還能夠將異常的相關資訊生成檔案,然後上傳到你指定的伺服器,供你分析除錯。當然你需要修改CrashReporter工程HttpUploadFileProc.cpp檔案HttpUploadFile函式裡相關變數的值,否則就上傳到到電驢的伺服器了。另外你還需要在你伺服器的WEB server上提供一個接收檔案上傳的程式,用來儲存使用者上傳的錯誤檔案。

最後再修改一下CrashReporter工程CrashReporter.cpp檔案InitInstance函式裡的下面這行程式碼:

ShellExecute(NULL, “open”, “eMule.exe”, NULL, NULL, SW_SHOW);

把eMule.exe改為你程式的檔名,要不然使用者的程式崩潰後在螢幕上看到的是一隻可愛的驢子,大概整個人也要被你搞崩潰了……

相關推薦

異常處理MFC程式崩潰的友好處理

軟體總存在這樣或者那樣的bug。 雖然測試員已經在很努力的尋找問題,程式設計師也在汗流浹背的除蟲,但是總會有一些情況被遺漏或者不可預測,比如使用者的硬體環境、網路狀況、作業系統差異等等,不一而足。而導致的結果則是彈出下面這樣一個讓使用者摸不著頭腦又惱火的提示,然後崩潰掉

VS2010學習筆記異常處理一(無法啟動此程式,因為計算機中丟失libiconv-2.dll)

問題1:“無法啟動此程式,因為計算機中丟失libiconv-2.dll” 問題描述:        在VS2010+Opencv2.4.7的程式除錯的過程中,再點選“執行”後,系統提示“無法啟動此程式

異常處理之 基本規則與基本規範

一、不要捕獲Java類庫中定義的繼承自 RuntimeException 的執行時異常類,比如空指標、比如陣列越界 二、try-catch 的用法,catch時,應該分清楚穩定程式碼和非穩定程式碼。注意對異常的細化 三、異常捕獲了,就要進行相應的處理。或者可以將異常進行上

影象處理 增加程式速度的方法

1. stack(棧) heap(堆) 和全域性區 測試BGR轉YUV  的表在stack 和 heap  2. 查詢表   部分查詢表  和3D查詢表  速度比較   3. 查詢表放在堆上和棧上的速度比較   4.

《瘋狂Java講義(第4版)》-----第10章異常處理

異常處理可以提高程式的健壯性、呈現功能給使用者更加友好。Java異常機制主要關鍵字:try、catch、finally、throw、throws。throws關鍵字在宣告方法時候使用,用於宣告該方法可能丟擲的異常。而throw關鍵字用於丟擲一個實際的異常。Jav

異常處理之 基本規則與基本規範

一、不要捕獲Java類庫中定義的繼承自 RuntimeException 的執行時異常類,比如空指標、比如陣列越界 二、try-catch 的用法,catch時,應該分清楚穩定程式碼和非穩定程式碼。注意對異常的細化 三、異常捕獲了,就要進行相應的處理。或者可以將異常進行上

Python學習異常處理

ror 捕獲 斷言 判斷 正常 res 是否 主動 常對象 異常 異常是指在程序中,導致程序無法繼續正常運行的事件。 異常是一個對象,一般在程序不能正常執行時被拋出。 一般來說,異常會導致程序中止。 為防止異常導致的程序中止,一般采取異常捕獲。 異常捕獲 try-e

ABP官方文件(三十六)異常處理

6.5 ABP表現層 - 異常處理 6.5.1 簡介 該文件只是針對ASP.NET MVC 以及Web API。如果你對ASP.NET Core也感興趣,請參考ASP.NET Core文件。 在 web 應用程式中,異常通常是在 MVC Con

阿里巴巴對Java程式設計異常處理的規約

異常處理 1. 【強制】 Java 類庫中定義的一類 RuntimeException 可以通過預先檢查進行規避,而不應該通過 catch 來處理,比如: IndexOutOfBoundsException , NullPointerExcept

再回首Python之美異常處理try-except

使用方法直接跳看:推薦使用的異常處理流程;推薦的內建函式的封裝函式異常處理必要性為了保證程式的健壯性,將可能出現異常退出的程式碼用try……except來處理捕獲異常的各種方法    1.捕獲所有異常print "\r\n=======try-except========="

VCwindow程式崩潰處理

程式設計師有太多的學習點,接觸不到就是一個盲點,今天看到c++在window下的崩潰處理。從此可以在程式崩潰時啟動自己的處理程式,或者友好的告訴使用者了。 #include "stdafx.h" #include <stdio.h> #includ

MFC 程式崩潰自動重啟 和 未捕獲到的異常寫退出棧

專案開發中,經常會有這些情況同時發生: 1. 專案工期很緊; 2. 程式不定期崩潰;(崩潰間隔時間較長、且跟蹤困難) 因此,總想找到一種方法,在程式崩潰後,能自動重新啟動,繼續執行。 帶著這個目的,經過一段時間研究後,發現可以採取這樣的方法:對整個程式的所有異常進行捕獲,然後接管系統的異常處理機

WebApi(六)異常處理解決方案

一、使用異常篩選器捕獲所有異常 我們知道,一般情況下,WebApi作為服務使用,每次客戶端傳送http請求到我們的WebApi服務裡面,服務端得到結果輸出response到客戶端。這個過程中,一旦服務端發生異常,會統一向客戶端返回500的錯誤。

計算幾何處理枚舉Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem K. Kiwi Trees

相交 const put vector freopen n) math turn blog 發現由於角的度數和邊的長度有限制,那倆圓如果放得下的話,必然是塞在兩個角裏。 於是預處理n個圓心的位置(註意要判斷那個圓會不會和其他的邊界相交),然後n^2枚舉倆角即可。 #inc

故障處理ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

options 配置信息 解決 fail 可用 soc none fma 刪除 今天在使用冷備份文件重做從庫時遇到一個報錯,值得研究一下。 版本:MySQL5.6.27  一、報錯現象 dba:(none)> start slave; ERROR 1872 (H

Visual StudioMFC does not support WINVER less than 0x0501 解決方案(轉)

.net style win blog 文件 ros family sim tar 原文轉自 http://blog.csdn.net/ygzhong000/article/details/41750841 解決方案:在stdafx.h頭文件中添加以下行。 #def

處理處理常用命令匯總

body html class pre bash 修改 批量 true log 批量修改文件後綴名/批量替換文件名某一部分 ren *.doc *.html ren *_20180112.html *_201801.html 【批處理】批處理常用

日期處理在日期加上幾天,返回日期。

www. 基礎 位數 pre cnblogs text date 日期 span <script type="text/javascript"> //日期,在原有日期基礎上,增加days天數,默認增加1天

處理TXT文件批量轉HTML文件工具

電子 程序 for ims 記事本 批處理 dexp 4.0 到你 說到批量轉html文件,相信喜歡看小說或經常制作電子書和教程的朋友應該很熟悉。因為,我們每次都會面臨成千上萬的txt文件,要將其轉換為能正確顯示的html文件是很麻煩的。當然,現在有很多的軟件也可以實現,但

處理基礎概述

man %s 朋友 符號 erro orm 文件的 conf 目錄名 前幾日我的小夥伴提到如何快速學習批處理以提高自己的學習工作效率,今天我就將自己以前的學習思路概述一遍! 首先,批處理,顧名思義,就是批量處理,它的要求是每一行每一句代碼就是可執行的... 裝逼模式開啟.