专题讨论MFC的异常处理(送100分)

vcmfc 2000-08-15 02:17:00
在C++中可使用try...catch,而MFC中可用TRY...CATCH(),我从CException类中派生CODBCExcption,在odbcerr.h中定义如下函数:
DisplayError(CException* e)
{
if(e->IsKindOf(RUNTIME_CLASS(CODBCException))
{
.....
}
}
编译中产生错误, 请问正确的用法?。
也请高手谈一谈其vc中的异常处理方法与在MFC中使用各种异常处理的优缺点.
...全文
356 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcmfc 2000-09-19
  • 打赏
  • 举报
回复
holly:你的意思我明白,我的主要意图是写一个能拦截所有MFC错误与其显示函数,我的CODBCException派生于CException,在显示函数中使用RUNTIME_CLASS()来识别错误的类来执行相应的错误显示,目能仍使用C++的异常拦截方法。
netsong 2000-09-19
  • 打赏
  • 举报
回复
关注
oldworm 2000-09-19
  • 打赏
  • 举报
回复
来迟了,大家继续。
Holly 2000-09-18
  • 打赏
  • 举报
回复
这么老的帖子!
还没有解决吗?你的CODBCException中有否:
// h文件
DECLARE_DYNCREATE(CODBCException)
// cpp文件
IMPLEMENT_DYNCREATE(CODBCException, CException)
如果没有,加上!
vcmfc 2000-09-10
  • 打赏
  • 举报
回复
请大家继续发言。
Holly 2000-08-27
  • 打赏
  • 举报
回复
有关错误处理的问题可以讨论许多篇幅!
在下只简单的说明一下:
在Visual C++中编程共有三种异常处理方式MFC,C++和SEH方式。

在MFC的源代码中经常见到大写的TRY...CATCH(ALL)宏机制,但是MS现在并不推荐使用这种方式,因为这是在早期的MFC3.0以前的版本遗留下来的,当时的编译器并不能真正的支持标准的C++异常处理语法,以后的编译器已经可以直接支持标准的C++异常处理的语法,而且功能上完全涵盖了MFC的异常处理宏,同时在代码的效率上,C++的异常处理效率要远远高于MFC的异常处理宏机制,这样的解释听起来是不是合理?不过这是MS在MSDN中已经详细论述的!

标准的C++异常处理在C++的程序中是最佳的方式,但有一样SEH的功能不具备,那就是__finally的支持,在操作系统提供的结构化异常处理中提供了__finally的处理方式,就是不论代码是否出错都必须执行的代码段。但是这个功能如果用到C++的程序中就要小心,因为SEH对构造函数中的异常的处理存在问题,因为__finally需要编译器对代码的执行流程进行改造,极有可能造成大量的代码扩展导致程序的效率大大降低。

总的来说,不用MFC的异常处理宏,尽量使用C++和SEH结构化异常处理(具体根据程序类型),但C++的异常处理相对的可移植性较好,在大部分的情况下应采用C++,只有对系统底层的编程就很可能使用SEH的方式较为合适!

更为详细的资料请大家在MSDN中搜索exception关键词,有许多有关的介绍和讨论!
vcmfc 2000-08-27
  • 打赏
  • 举报
回复
系统又提示if(e->IsKindOf(RUNTIME_CLASS(CODBCException)))中CODBCExeception错误,可我CODBCException派生于CException,为啥CFileException能,求大虾给俺解惑?
vcmfc 2000-08-25
  • 打赏
  • 举报
回复
这是程序的源码:
void CPublicDlg::DisplayError(CException* e)
{CString m_strErr;
if(e->IsKindOf(RUNTIME_CLASS(CODBCException)))
{
CODBCException* pdb=(CODBCException*)e;
m_strErr.Format(_T("ODBC错误码:%d\nSQL状态码:%s\n错误信息:%s"),pdb- >m_ErrorCode,pdb->m_strSQLState,pdb->m_strDescription);
if(e->m_ErrorLevel==0)
::MessageBox(GetSafeHwnd(),m_strErr,_T("系统错误提示"),MB_OK|MB_ICONSTOP);
else
::MessageBox(GetSafeHwnd(),m_strErr,_T("系统错误提 示"),MB_OK|MB_ICONEXCLAMATION);
pdb->Delete();
return;
}
vcmfc 2000-08-16
  • 打赏
  • 举报
回复
错误信息:在DisplayError()中e->IsKindOf(RUNTIME_CLASS(CODBCException))is on member "CODBCException",且我在CODBCException中有内部变量m_ErrorCode,m_ErrorLevel,m_SQlState等在DisplayError()中提示e中无此变量, 无法完成编译.
vcmfc 2000-08-16
  • 打赏
  • 举报
回复
因为的程序中使用odbc API,在公共程序中包装了部分ODBC API函数,在公共包装的ODBC API中如果执行错误将抛出CODBCException,那么在使用中需要拦截CODBCException,并使用DisplayError()业显示错误。
zzh 2000-08-15
  • 打赏
  • 举报
回复
可以这样处理:
try
{
db.Open();
}
catch(CDBException *e)
{
MessageBox(e->m_strError,"提示信息",MB_OK);
e->Delete();
}
其实,没必要自己从CDBException派生出自己的类,可以用MessageBox或AfxMessageBox来显示你当前的错误。至于异常处理,只要你把它捕获就可以了。
有如下几种用法:
1、
try
{
}
catch()
{
}
2、
try
{
}
catch(...)
{
}
TRY
{
}
CATCH()
{
}
END_CATCH
bbslucky 2000-08-15
  • 打赏
  • 举报
回复

try
{
}
__except
{}
bbslucky 2000-08-15
  • 打赏
  • 举报
回复

try
{
}
__except
{}
bird2000 2000-08-15
  • 打赏
  • 举报
回复
编译中产生错误, 请问正确的用法?。

能帖出错误信息吗?
Sniper 2000-08-15
  • 打赏
  • 举报
回复
你为什么不用CDBException类呢?
vcmfc 2000-08-15
  • 打赏
  • 举报
回复
补充一下:如下使用方法是否正确:
TRY
{
...使用函数中使用AfxODBCException()
}
CATCH(CException*,e)
{
DisplayError(e);
....
}
这样能否拦截到原先的抛出的CODBCException*异常吗?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧