请问C++的异常语句有try except和try finally形式吗

fengxvhui 2003-05-27 10:15:33
我学了全是try catch形式的。
如果有,能否举个例子。
...全文
1262 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengxvhui 2003-07-14
  • 打赏
  • 举报
回复
收藏之。
glasswing 2003-07-14
  • 打赏
  • 举报
回复
to fengxvhui(学得快忘得快):

我的意思是,不要随便使用一些编译器加入的非标准C++的语言设施啦。如果某个语言设施真的有必要,可以给BS写信谈谈,让其加入到下一个版本的ISO标准中,呵呵。

‘获得即初始化’技术(很C++的技术,呵呵)并非只是在关闭文件的时候有用;它可以用在任何有某些资源需要被释放的场合。比如内存,你申请使用了以后必须被释放(不同与垃圾收集的一种内存管理方式);比如网络socket;... 方法就是:把任何你要使用的资源封装到一个类中,在类的constructor里获得资源,在distructor中释放资源。这样,你的程序里就很难会出现资源泄露的问题。
vlmf 2003-07-11
  • 打赏
  • 举报
回复
SwordMan2001(天笑2001) :
C++ 标准没有描述异常是是否关闭文件. 但她保证异常发生的时候所有已经构造的对象都会被析构.:)
vlmf 2003-07-11
  • 打赏
  • 举报
回复
bool CommandDriver::ExecCommand(const string& CommandLine)
{
bool bSuc = true;
try
{
CommandPoint pCommand(CreateCommand(CommandLine));
pCommand->Exec();
cout << endl << "^_^ Command: [" << CommandLine << " ] Successfully Complete!" << endl;
}catch(CommandException& e)
{
cout << e.what() << endl;
bSuc = false;
}catch(ICCException& e)
{
cout << e.what() << endl;
bSuc = false;
}catch(DataException& e)
{
cout << e.what() << endl;
bSuc = false;
}catch(DataTypeException& e)
{
cout << e.what() << endl;
bSuc = false;
}
catch(...)
{
cout << "Unknown Error!" << endl;
bSuc = false;
}
return bSuc;
}
fengxvhui 2003-07-11
  • 打赏
  • 举报
回复
vlmf(散淡书生)说的对,程序退出时(正常退出和异常退出)所有已经构造的对象都会被析构

“file f("filename"); // 在f的构析函数自动会关闭打开的文件”
中,由于关闭文件的语句在构析函数中,所以无论何种情况发生(当然不包括掉电,呵呵),文件都会关闭。
不过我还没明白
“所以,在c++中不要使用乱七八糟的扩充,把任何资源(包括内存)封装到你的类中”
这句话。
SwordMan2001 2003-07-11
  • 打赏
  • 举报
回复
> glasswing(蜻蜓飞飞)
C++会自动关闭打开的文件吗(即使在异常时)?
SwordMan2001 2003-07-10
  • 打赏
  • 举报
回复
我用BCB6,可以通过编译,结果是
hello
in try
in try
in filter
in finally
in except
world

我没有听说过try except和try finally形式的错误捕获,可以解释一下是什么意思吗?
langhaixin 2003-07-10
  • 打赏
  • 举报
回复
try finally 是从delphi引入bcb里面的

这个语法是bcb的方言
glasswing 2003-07-10
  • 打赏
  • 举报
回复
如前面 steedhorse(晨星) 所说,std c++没有finally机制。我讲一下为什么吧 :)

finally的引入是为了解决异常安全问题;看下面的代码:
//在没有异常的美好世界中
void foo()
{
FILE *pf = fopen("filename");

// do something...

fclose(pf);
}

这一切工作的相当好,文件被打开,然后被使用,在退出的时候也被安全地关闭;但是引入异常后,这段代码就不再这么好了:
//有异常~~
void foo()
{
FILE *pf = fopen("filename");

// do something... 如果这里抛出异常,呜~,pf就不会被关闭了

fclose(pf);
}

解决的办法是:
//finally的解决办法
void foo()
{
FILE *pf = fopen("filename");

try {
// do something...可能抛出异常
}
finally {
fclose(pf); // pf总能被关闭
}
}

挺不错,但是c++里有更好的解决方案,就是被称为‘获得既初始化’的技术
//c++的方式
void foo()
{
file f("filename"); // 在f的构析函数自动会关闭打开的文件

// do something... 抛出异常,自动关闭文件

// 函数退出,自动关闭文件
}

所以,在c++中不要使用乱七八糟的扩充,把任何资源(包括内存)封装到你的类中
slimak 2003-07-10
  • 打赏
  • 举报
回复
__try,__except和__try,__finally是Windows提供的异常处理机制,全名叫SEH
C++提供的try-catch和上面提到的是不同的异常处理机制.
一个是语言提供的,一个是OS提供的
关于这个请参看Windows核心编程,好像后面有一章说得很清楚.
代码之诗 2003-07-10
  • 打赏
  • 举报
回复
__finally 是 Borland 的扩展,Borland 在帮助文件中说得很清楚了。也就是说,这种用法仅适用于 Borland 的 C++ 编译器。标准 C++ 中没有 finally 机制,因为 C++ 的设计者认为这是 destructor 的事(见 《C++ 语言的设计与演化》)。
xzygod 2003-07-10
  • 打赏
  • 举报
回复
_和__开头的基本上不是c/c++标准
pengzhenwanli 2003-07-10
  • 打赏
  • 举报
回复
没有.非标准C++比如说C++Builder中的C++编译器
wlfjck 2003-07-10
  • 打赏
  • 举报
回复
没有。这种机制Delphi和Java中有
fengxvhui 2003-05-27
  • 打赏
  • 举报
回复
编译通不过,我用Visual C++ 6
zhaohangcom 2003-05-27
  • 打赏
  • 举报
回复
// Example of try-except and try-finally statements
#include "stdio.h"

void main()
{
int* p = 0x00000000; // pointer to NULL
puts("hello");
try{
puts("in try");
try{
puts("in try");
*p = 13; // causes an access violation exception;
}__finally{
puts("in finally");
}
}__except(puts("in filter"), 1){
puts("in except");
}
puts("world");
}
晨星 2003-05-27
  • 打赏
  • 举报
回复
C++没有finally机制的。

69,374

社区成员

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

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