以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 狐爸看过来,找到狐表的重大bug (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=46874) |
-- 作者:yedaoan -- 发布时间:2014/2/28 15:51:00 -- 狐爸看过来,找到狐表的重大bug 花了很长时间来测试 Try Catch语句,原贴见(http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=46692&authorid=0&page=0&star=1) 一直以为Try Catch能捕获错并进行错误处理,实际上确实可以,问题是,如果Datatable产生的错误,结果就不一样了,出错后,仍然会执行后面的代码,而且不会跳到Catch语句。 测试1: Try Dim t As Table = e.Form.Controls("Table1").Table t.DataTable.DeleteFor("dwmc is null") t.AllowAddNew=False t.AllowEdit=False t.AllowDelete=False MessageBox.Show(1) t.DataTable.Save MessageBox.Show(Err.Number) e.Form.Controls("txtZt").Text="查看状态" Functions.Execute("ButtonZt") MessageBox.Show(5) Catch ex As Exception MessageBox.Show("关键字重复或空值,不能保存!") End Try 结果是执行到 t.DataTable.Save 弹出错误信息,代码依然执行 MessageBox.Show(Err.Number),和 MessageBox.Show(5) 测试2:(想用On Error Goto )来代替 Try Catch,代码如下 On Error Goto Err_Msg Dim t As Table = e.Form.Controls("Table1").Table t.DataTable.DeleteFor("dwmc is null") t.AllowAddNew=False t.AllowEdit=False t.AllowDelete=False MessageBox.Show(1) t.DataTable.Save MessageBox.Show(Err.Number) e.Form.Controls("txtZt").Text="查看状态" Functions.Execute("ButtonZt") MessageBox.Show(5) Exit Sub Err_Msg: MessageBox.Show("关键字重复或空值,不能保存!") Exit Sub 还是执行到 t.DataTable.Save 弹出错误信息,代码依然执行 MessageBox.Show(Err.Number),和 MessageBox.Show(5),去掉第一个Exit Sub,仍然执行后面的 Err_Msg: 测试3: Try Dim t As Table = e.Form.Controls("Table1").Table t.DataTable.DeleteFor("dwmc is null") t.AllowAddNew=False t.AllowEdit=False t.AllowDelete=False Forms("窗口11").Open \'窗口11,并不存在,为了能出错增加了这一条 MessageBox.Show(1) t.DataTable.Save MessageBox.Show(Err.Number) e.Form.Controls("txtZt").Text="查看状态" Functions.Execute("ButtonZt") MessageBox.Show(5) Catch ex As Exception \'Err_Msg: MessageBox.Show("关键字重复或空值,不能保存!") \'Exit Sub End Try 由于 Forms("窗口11").Open 出错在前,没有执行后面的代码直接跳到 Catch ex As Exception,为此,问题就是是出在 t.DataTable.Save ,只要有这个Datatable出错,Try Catch 就形同虚设 最后无奈之后,用了下面的代码,但这并不是我想要的 Try Dim t As Table = e.Form.Controls("Table1").Table t.DataTable.DeleteFor("dwmc is null") t.AllowAddNew=False t.AllowEdit=False t.AllowDelete=False MessageBox.Show(1) t.DataTable.Save MessageBox.Show(Err.Number) If Err.Number=0 Then E.Cancel=True Exit Sub End If e.Form.Controls("txtZt").Text="查看状态" Functions.Execute("ButtonZt") MessageBox.Show(5) Catch ex As Exception \'Err_Msg: MessageBox.Show("关键字重复或空值,不能保存!") \'Exit Sub End Try 还有狐爸在原贴里的那段代码也测试过了,问题跟测试1和测试2的一样,只要是Datatable 出错 Try Catch就形同虚设,没有继续在原贴上写而开新贴的原因是,怕没有引起狐爸的重视!怕贴子沉得太快,没人关注。 |
-- 作者:狐狸爸爸 -- 发布时间:2014/2/28 15:54:00 -- 这不是bug,因为foxtable自己截获错误加以提示后,会继续执行后面的代码。
那个帖子我已经告诉你处理方法了。 |
-- 作者:yedaoan -- 发布时间:2014/2/28 15:56:00 -- 我要的是出错后,不要执行出错后代码,你给的那个例子,也同样会在出错后执行后面的代码,我该如何解决 |
-- 作者:狐狸爸爸 -- 发布时间:2014/2/28 15:56:00 -- 我最后一次给的代码,你看了吗 |
-- 作者:yedaoan -- 发布时间:2014/2/28 15:57:00 -- 看了也测试了,结果是一样的 |
-- 作者:yedaoan -- 发布时间:2014/2/28 16:01:00 -- 还是你这段代码,也不是我要的结果,还不如 If Err.Number=0 Then E.Cancel=True Exit Sub End If 但这样,程序就失去意义了,难道Datatable出错,不能像其他出错一样,直接转到Catch语句后,这逻辑上有冲突吗?
|
-- 作者:狐狸爸爸 -- 发布时间:2014/2/28 16:07:00 -- 这个不是bug来的,就用你自己的办法解决吧。
foxtable会主动拦截绝大多数错误,否则用户写错一个代码,且没有用try catch捕获的话,整个foxtable就会崩溃。 [此贴子已经被作者于2014-2-28 16:09:06编辑过]
|
-- 作者:yedaoan -- 发布时间:2014/2/28 16:09:00 -- 晕了,没有其他办法了吗?这不符合逻辑啊,其他出错都能跳转,为什么Datatabel出错不能跳转 狐爸别生气,不是我一定要说这个是bug,但我实在想不通
|
-- 作者:狐狸爸爸 -- 发布时间:2014/2/28 16:15:00 -- 不是其它错误会跳转,实际上,大多数涉及数据处理的错误都不会跳转的哦,否则foxtable早就乱套了,因为foxtable面对普通用户,基本上写代码的都不严谨,也不懂用 try catch的。 [此贴子已经被作者于2014-2-28 16:20:33编辑过]
|
-- 作者:yedaoan -- 发布时间:2014/2/28 16:33:00 -- 哦,那狐爸有没有错误号清单啊,如果0 代码是什么错误号引起,100代表什么错误号引起 |