以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  狐爸看过来,找到狐表的重大bug  (http://www.foxtable.com/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代表什么错误号引起