最近接触windows系统的应用开发(也算是初次接触,一直都是用java来开发应用程序),遇到了一个我认为比较棘手的问题。 就是 相当多的异常通过try-catch块儿捕获不到,通过google和在csdn论坛上搜索得到了一些建议,最后我在《windows 核心编程》中找到了解决方法。
SEH(结构化异常处理)是一种叫底层的异常处理形式(我的理解),我认为try-catch形式异常(《windows核心编程》中称其为c++的异常处理)应该是对SEH的一个封装吧或者是c++语言形式的重写。 不过c++捕获不到内存访问异常(我理解为java的NPE),可我的程序必须要处理类似的异常,具体解决方法如下:
自定义一个class
在任何异常捕获之前一定要运行CSE的静态方法 MapSEtoCE();
我对windows开发的研究还比较肤浅,请csdn的大牛们多多指点。
先写来,如果发现理解的有问题,日后更改~ :)
SEH(结构化异常处理)是一种叫底层的异常处理形式(我的理解),我认为try-catch形式异常(《windows核心编程》中称其为c++的异常处理)应该是对SEH的一个封装吧或者是c++语言形式的重写。 不过c++捕获不到内存访问异常(我理解为java的NPE),可我的程序必须要处理类似的异常,具体解决方法如下:
自定义一个class
#include
<
eh.h
>
#include " stdafx.h "
bool bIsSetTanslator;
class CSE {
public :
static void MapSEtoCE(){
if(!bIsSetTanslator) {
_set_se_translator(TranslateSEtoCE);
bIsSetTanslator = true;
}
}
operator DWORD() {return (m_er.ExceptionCode);}
private:
CSE(PEXCEPTION_POINTERS pep){
m_er = *pep->ExceptionRecord;
m_context = *pep->ContextRecord;
}
static void __cdecl TranslateSEtoCE(UINT dwEC,PEXCEPTION_POINTERS pep)
{
throw CSE(pep);
}
private:
EXCEPTION_RECORD m_er;
CONTEXT m_context;
} ;
#include " stdafx.h "
bool bIsSetTanslator;
class CSE {
public :
static void MapSEtoCE(){
if(!bIsSetTanslator) {
_set_se_translator(TranslateSEtoCE);
bIsSetTanslator = true;
}
}
operator DWORD() {return (m_er.ExceptionCode);}
private:
CSE(PEXCEPTION_POINTERS pep){
m_er = *pep->ExceptionRecord;
m_context = *pep->ContextRecord;
}
static void __cdecl TranslateSEtoCE(UINT dwEC,PEXCEPTION_POINTERS pep)
{
throw CSE(pep);
}
private:
EXCEPTION_RECORD m_er;
CONTEXT m_context;
} ;
在任何异常捕获之前一定要运行CSE的静态方法 MapSEtoCE();
CSE::MapSEtoCE();
try {
* ( byte * ) 0 = 0 ;
int x = 0 ;
x = 5 / x;
}
catch (CSE se){
cout << " exception " << endl;
}
try {
* ( byte * ) 0 = 0 ;
int x = 0 ;
x = 5 / x;
}
catch (CSE se){
cout << " exception " << endl;
}
先写来,如果发现理解的有问题,日后更改~ :)