为什么 我的异常扑捉不到?

10water 2003-04-14 04:57:14
字段FNumber不允许空
代码如下:
try
{

frm_s_xjd_n->adoqry_xjd_cp->FieldByName("FNumber")->AsInteger=Edit1->Text; // 字段FNumber不允许空;

}
catch(Exception& e)
{
ShowMessage(e.Message.c_str() );
}
当我在Edit1中输入空时(也就是不输任何东西)。那么就变成了把空值输到FNumber字段中了,于是就发生异常错误了。可是为什么我在catch中抓不到呢?
我把catch(Exception& e)换成catch(...)也不行,不知道是怎么回事,请高手指点,先谢了。
...全文
42 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
8water 2003-04-14
  • 打赏
  • 举报
回复
jishiping(JSP 季世平) ( ) 兄,帮我看看这个:先谢了。http://expert.csdn.net/Expert/topic/1660/1660816.xml?temp=.9658472
8water 2003-04-14
  • 打赏
  • 举报
回复
FNumber 的类型是什么? 是 varchar
jishiping 2003-04-14
  • 打赏
  • 举报
回复
FNumber 的类型是什么?int 还是varchar? 最简单的测试方法,是用一个SQL语句测试。如:
ADOQuery1->SQL->Text = "UPDATE <TableName> SET FNumber=NULL";
try {
ADOQuery1->ExecSQL();
}
catch(Exception& e) {
ShjowMessage(e.Message);
}
10water 2003-04-14
  • 打赏
  • 举报
回复
to ;jishiping(JSP 季世平) ( )
非常感谢你的解答问题是,用你的代码:
try
{
frm_s_xjd_n->adoqry_xjd_cp->FieldByName("FNumber")->AsVariant.Clear();
}
catch(Exception& e)
{
ShowMessage(e.Message.c_str() );
}
好象还是不能抛出异常。怎么回事。
另外,的确 我的代码有问题。应该换成;

try
{

frm_s_xjd_n->adoqry_xjd_cp->FieldByName("FNumber")->AsString = Edit1->Text; // 字段FNumber不允许空;

}
catch(Exception& e)
{
ShowMessage(e.Message.c_str() );
}
问题又来了 。居然空值也能插进去了 。
我在后台数据库中打开来时,发现。在FNumber中一个空的。但我在设计数据库时,明明不允许空的,也就是说 我在“允许空”出并未打勾。(我是 SQL SERVER 2000 + BCB 5。0)
怎么回事。请指点,谢了。
jishiping 2003-04-14
  • 打赏
  • 举报
回复
你这样测试,就会发生抛出了:
try
{
frm_s_xjd_n->adoqry_xjd_cp->FieldByName("FNumber")->AsVariant.Clear();
}
catch(Exception& e)
{
ShowMessage(e.Message.c_str() );
}
jishiping 2003-04-14
  • 打赏
  • 举报
回复
不对啊,楼主的代码,编译通得过吗? ->AsInteger = Edit1->Text; 左边是整数,右边
是AnsiString,编译根本通不过的啊。
jishiping 2003-04-14
  • 打赏
  • 举报
回复
请注意,在数据库里,一个字段的值为 NULL ,和字段的值为"" 是不同的概念。如何字符串
s=NULL; 和 s=""; 是不同的概念。所以你上面的代码不会发生抛出。
10water 2003-04-14
  • 打赏
  • 举报
回复
你脱离编译环境直接运行EXE试试 是可以的
但那个扑捉到的也是BCB本身已经做好了的异常,也就是说如果,我不写
catch(Exception& e)
{
ShowMessage(e.Message.c_str() );
}
则在脱离编译环境直接运行EXE,也能被扑捉到。
keenleung 2003-04-14
  • 打赏
  • 举报
回复
因为Assert是Debug环境下有效的,如果你在异常触发后继续运行的话,是会运行到catch段的
keenleung 2003-04-14
  • 打赏
  • 举报
回复
说错了,把第一句忽略就可以了
keenleung 2003-04-14
  • 打赏
  • 举报
回复
try..catch是工作在Release模式下的,在Debug模式下该报的错还是会报.
你脱离编译环境直接运行EXE试试
c2y 2003-04-14
  • 打赏
  • 举报
回复
可以用其他方法避免异常发生
1、如果Edit1输入为空,不允许焦点移走
2、如果Edit1可保证为数字或空,可以这样frm_s_xjd_n->adoqry_xjd_cp->FieldByName("FNumber")->AsString=Edit1->Text;

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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