如何正确处理异常

imfjl 2003-01-11 01:48:34
用TQuery对数据库进行插入操作,如果数据库抛出异常,应该如果正确的处理.我在98下对数据库进行操作,将ExecSQL放在try中,但catch中没有进行任何处理,结果蓝屏了.各位有什么好的建议吗?谢谢!
...全文
55 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
copy_paste 2003-01-11
因为IDE编绎器首先获得异常,然后中断程序,跑到IDE的错误地方,
这是因为IDE环境设置的原因,可以将:
menus->tool->Debugger options->Lanuage Exceptions这个页面

有一个"Stop on Delphi Exception" & "Stop on C++ Exception"那两个CheckBox去掉即就可以不用在IDE环境中,会异常就返回到IDE界面中了。。。

在界面/应用层中,Borland总是建议抛出一个异常来作为中断程序运行的处理。如下:

SomeProc()
{
// 1:
if (Edit1->Text == "")
{
MessageBox(Handle, "Edit1不能为空", "Error", MB_ICONERROR);
return;
}

// 2:
if (Edit1->Text == "")
{
throw Exception("Edit1不能为空");
}
}

第2种方法是建议使用的,而不是使用MessageBox, ShowMessage & return来处理。。。
不然异常的作用就体现不了它的作用了。。。

try
{
ADOConnection->BeginTrans();
//执行插入语句
ADOConnection->CommitTrans();
}
catch(Exception &e)
{
ADOConnection->RollbackTrans();
//将异常里面的消息改变一下
e->Message = "什么什么处理失败,原因:" + e.Message;
//再重新抛出异常
throw;
}

一个异常如果没有给捕获,那么最终由Application捕获,那么Application捕获的处理就是一个ShowException处理,Application已经作好了,自己何必再多做一次try catch处理了???

如果想自已做Application的异常,可以重写Application->OnException事件。。。

如果你是多线程应用,那抛出异常时,请注意同步,即如果线程运行代码有异常时,先捕获它,然后再用Synchroize来同步你的再抛出异常的方法,,,当然可以使用消息来通知主线程的方法。

如果是Console应用,呵呵,有SysUtils::ShowException进行处理你Console的异常,也就是在屏幕上Display exception message 。。。

没了。。。
回复
beerboy 2003-01-11
楼主所说问题困扰我好长时间了,我很早就愈见这个问题,一指解决不了。
今天看了楼上mee123456的答案,才恍然大悟,在自己机子上试了一下,嘿,还真管用。
回复
rikky 2003-01-11
对数据库操作做事务,如果可以事务做在存储过程里个人认为比较好一点
回复
jznu 2003-01-11
ppfyk(畔泮扶摇客)说的情况我也遇到过,编译成exe文件成功后安装在其它机器上运行依然是只有后台系统触发器的提示,自己的信息显示不了,我也用过楼上mee123456的处理方式,得到结果如故。对我来说,这个难题也困绕了我很久,不知哪位英雄能给一个完美的答案?
回复
mee123456 2003-01-11
try
{
ADOConnection->BeginTrans();
//执行插入语句
ADOConnection->CommitTrans();
}
catch(Exception &e)
{
ADOConnection->RollbackTrans();
ShowMessage(e.Message);
}
楼上仁兄所说,是因为你在CB调试环境下运行程序,CB首先截获错误。
你直接双击编译后生成的exe文件,就是用你自己的处理了。
回复
ppfyk 2003-01-11
是的是的,你一说提起我的问题了,我也是有这样的疑问,不过我遇到的是:在SQL语句的操作中,若是出现错误,系统提示的是后台数据库报错的信息,而不是我定义的报错信息,我总想做得更完善一些,让自己的错误提示和后台数据库的错误提示都显示出来,也是一直没有搞清怎么做
回复
halibut 2003-01-11
使用事务吧,出错后事务回滚,可以保证数据的完整!
回复
copy_paste 2003-01-11
你这点我倒没想过,,,,

因为throw Exception不是通过new出来的,也就是堆里面的东东,而堆里面的我们一般不去考虑它吧,,,,由系统自己控制的吧。。
我也不清楚了。。。
回复
imfjl 2003-01-11
即使让我捕捉到了,我还是应该怎么做呢?
在2000下我确实捕捉到了,而且用资源管理器可以看出当我捕捉后什么都不做的时候内存被一点点的占用去了.
回复
猛禽 2003-01-11
我再补充一点吧:

一般数据库操作的异常处理过程不太一样,有一些可能是异步的,所以你用try...catch可能抓不到,但它们通常提供了方法让你处理:这就是事件

大多数数据库控件都有一堆的OnXXXError事件,在这里,你就可以进行你自己的出错处理了。
回复
imfjl 2003-01-11
大家讨论讨论着,怎么跑到异常处理上了呢?其实我的问题更多在对数据库的操作上.用事务应该是不错的选择.只是,由于程序只是处理记录,并插入到数据库,所以我只是简单的用TQuery直接用SQL语句进行插入.每处理出一条记录就执行一次SQL.但是,问题就在于,如果我要插入很多条记录,而这很多条记录可能已经存在于数据库中了,表也用了约束,使程序插入不了.结果程序会每插入一条记录就抛出一个异常.对我来说,我并不用去理它,只要库中已经存有该记录就可以了,所以我catch后就不理它了.但对程序来说,每抛出一个异常,会失去一些资源(我个人认为),所以应该处理.不然,当插入多条记录时,并抛出多个异常时,程序很容易死掉.所以,我的问题就是如何释放那些由异常而占去的资源.再一次谢谢大家的回答!:)
回复
相关推荐
发帖
数据库及相关技术
创建于2007-08-02

1158

社区成员

C++ Builder 数据库及相关技术
申请成为版主
帖子事件
创建了帖子
2003-01-11 01:48
社区公告
暂无公告