关于异常的设计

jianshen77 2003-09-29 04:47:34
在程序设计的时候,大家是否很少给函数设计异常规格,
方正我是很少了。于是在一些函数里面,经常凭感觉catch一些
自己认为可能抛出的异常,如:
try{
foo()
   }catch(std::bad_cast&)
{
.....
}
甚至是多处充斥着catch(...);
这样的异常处理让我感觉自己的代码很丑陋,
可是给每个(或者说是大多)函数设计异常规格,总感觉是一件很难做的事情。
怎样解决这个问题呢?根据一些大师的文章,在和与一些个人的想法,这样的想法
是否是个方法呢?
创建一个异常基类baseexc,所有的异常通过这个基类派生如logsexc,让后可以这样声明自己的函数
void foo( )throw(baseexc);
即使foo抛出了其他异常,违反异常规格,我们也可以通过
set_unexpected( );函数抛出baseexc来解决。
最后我们程序就可以这样写
try{
foo();
}catch(logsexc& loge)
{...}
catch(baseexc& r)
{....}
以上是个人的想法,权做抛砖引玉之用,因为我感觉,好像在论坛里面,讨乱
异常的很少,但又是基本天天碰到的问题。希望多多指点,多多发言。也是学习的
好过程吧!

...全文
42 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianshen77 2003-10-10
  • 打赏
  • 举报
回复
楼上谈的很又道理!盼多言!
liao2001 2003-10-09
  • 打赏
  • 举报
回复
"出现一个小的问题,系统就退出运行"?
异常应该不能够用“小问题”来称之,操作系统或者vc之所以遇到异常时将进程杀掉,我想应该是出于保护其他进程或系统的正常运转的缘故。通过处理异常来维持进程的运转,不是不可以,除非你能保证这个恢复是可行的,当然此处说的可行不仅仅是对于进程本身。
所以我的观点是:
对于开发一个实时性比较高系统来说,可恢复性错误应尽量避免用异常来处理,因为这样一来只会增加系统的开销;而对于严重错误可以采用抛出异常或者kill进程。
一个频繁产生异常的系统,它的“健壮性”就已经值得怀疑了,然后用处理异常来维持运转,亡羊补牢,是好是坏,我不敢妄下结论。
试想,windows出现异常了,我们除了重起和注销还能做什么呢?
vsfan 2003-10-09
  • 打赏
  • 举报
回复
大家对可控异常有什么看法没?
jianshen77 2003-10-09
  • 打赏
  • 举报
回复
学习中......
fireseed 2003-09-30
  • 打赏
  • 举报
回复
个人认为BCB做为一个RAD工具,和VC没有可比性。

从本质上来说,RAD工具的稳定性……呵呵……
fireseed 2003-09-30
  • 打赏
  • 举报
回复
BCB只是捕获了程序运行时的异常,然后弹出自己的异常信息对话框。它捕获异常的确不会立即退出系统,但在弹出异常对话后程序也就结束了,这是多此一举吗?其实这是Borland公司为了“风格化”而做的一些工作,比如实现多语言等功能,并不是什么完整的异常处理。
VC则没有必要这样做,因为操作系统会捕获异常,然后弹出那个系统标准的异常对话框。如果你想在VC中这样做,那么在实例化程序的代码外加上try和catch吧,效果是一样的。
jianshen77 2003-09-30
  • 打赏
  • 举报
回复
异常是带来一些空间与时间的开销,意味着一个问题,但对于一些程序,
系统的安全性,也可以说是健壮性要求较高!并不希望,出现一个小的问题,
系统就退出运行,所以使用异常希望能够从“失误”中恢复过来!
这是我在用vc时的一个感觉,在c++builder中,一些“它能够忍受”的错误
造乘抛初异常,它并不会退出系统,vc就不一样,只要出现未捕获的异常。直接残忍的退出
应用程序。所以有此想法。下面是c++builder自己生成的一段代码
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
tolixiaohui 2003-09-30
  • 打赏
  • 举报
回复
过犹不及!
jianshen77 2003-09-30
  • 打赏
  • 举报
回复
上面那段bcb代码,是bcb把未知异常转换到了自己能够处理的异常
导致运用程序不会残忍的立即退出,并且还处于良好的消息循环中!
我未知之处,请各位指点,如下未一按钮事件处理函数

{
throw "I amd Exc";
}
在vc下,直接抛出异常,然后退出程序,
但是在bcb下,还可以处于良好的消息循环中。
我在这里不是想比较vc与bcb,只是两个处理异常的情况不一,
并且我认为bcb的较好一些,虽然它掩藏的异常有可能带来更可怕的后果,
但我还没碰到过,也许是经验有限!
liao2001 2003-09-29
  • 打赏
  • 举报
回复
长期搞c的缘故,我只是学c++时了解了一点异常,据说异常的花销要大不少,个人感觉也是如此,所以要慎用。“异常”一词就意味着这是一个比较严重的错误,且这个错误可能导致程序不能正常运行。我还发现一些程序员写的程序,不管问题大小,反正抛出异常先,似乎带有一种不屑于使用返回值的意味,但愿他们是对的,我是极力反对。
大家不讨论异常,我想应该是一般都不用到,所以都没有去深究吧,盼高人能指出点什么。
fireseed 2003-09-29
  • 打赏
  • 举报
回复
我一般很少用异常,因为如果异常出现了,大多是程序无法处理的情况,那就干脆不要catch,交给系统catch吧。但有时用会比较方便。比如在一个函数中,一开始申请了一堆内存,在后面的代码中又有多处错误情况需要return,而在每个return之前你又需要来释放这些内存,那么用异常就会非常方便,这么写:

// 申请内存
char *p = new char[256];

try
{
if ( aa == 0 )
{
throw;
}
if ( bb != 0 )
{
throw;
}
//这里是正常返回代码
//……
//释放内存
delete []p;
return 0;
}
catch(...)
{
delete []p;
return 1;
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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