有没有办法压制所有与OLE有关的错误?例如,如果我尝试访问不存在的服务器应用程序的属性,有运行时错误“错误访问外部对象属性”如何摆脱所有OLE相关的错误?我使用了select
min(date) post_date,
max(date) last_click_date,
link,
code,
max(sum_clicks) clicks_total
from (
select
t.*,
@sum := if(@lastcode = code and @lastlink = link, @sum + clicks,
if(
(@lastcode := code) is not null and
(@lastlink := link) is not null,
clicks, clicks
)
) sum_clicks
from (
select *
from table1
order by code, link, date
) t cross join (
select
@lastcode := null,
@lastlink := null,
@sum := 0
) t2
) t
where sum_clicks >= 100
group by link, code;
... TRY
,但我想这不是解决此问题的方法。
CATCH
TRY
lpn = Long(tab_1.tp_preview.ole_view.object.GetCurrentPageNumber)
CATCH ( PBXRuntimeError re )
CATCH ( OLERuntimeError OLERROR)
CATCH ( RuntimeError RROR)
FINALLY
lpn = Long(tab_1.tp_preview.ole_view.object.GetCurrentPageNumber)
END TRY
不是无效属性,但在我的脚本中无效,因为上一行访问GetCurrentPageNumber
属性。
报告中的页面很少,可能ShowLastPage
确实需要一段时间才能到达最后一页但下一个语句ShowLastPage
在此之前执行。
这就是我认为我只在脚本运行时第一次收到运行时错误的原因。相同脚本的所有后续执行都没有,并且没有显示运行时错误,因为当控件中已显示最后一页时,GetCurrentPageNumber
不会显示任何运行时错误。
我认为这个问题的解决方案是在GetCurrentPageNumber
完成其工作之前,我一直在循环中检查GetCurrentPageNumber
。但是我在代码中写的ShowLastPage
... TRY
无法抑制运行时错误消息。
请告诉我该怎么做。
我正在使用PowerBuilder 12.5和Crystal Reports 11.5
答案 0 :(得分:0)
对于您的特定代码>>>如果GetCurrentPageNumber是罪魁祸首,你的TRY-CATCH将只捕获异常。
无论如何,我认为没有充分的理由在FINALLY子句中重复访问GetCurrentPageNumber。这将始终访问该属性两次。如果FINALLY中的访问引发异常,则不会捕获该异常!
如果您对ShowLastPage方法的调用引发异常,我会考虑这一点(考虑到“单一责任”):
在一个返回布尔值的函数(例如,名为ShowLastPage
)中包含对of_ShowLastPage
的调用(true:succeeded,false:failed)。
注意:CATCH RuntimeError
捕获所有未经检查的异常类型。
FUNCTION boolean of_ShowLastPage( );
TRY
tab_1.tp_preview.ole_view.object.ShowLastPage
RETURN TRUE
CATCH (RuntimeError exRuntime)
RETURN FALSE
END TRY
使用单独的函数将of_ShowLastPage
包装在循环中等待成功。确保你没有创建无限循环!
FUNCTION boolean of_WaitForLastPage( )
constant long maxRepeat = 1000
boolean displayingLastPage
long repeatCount
DO
displayingLastPage = of_ShowLastPage( )
IF NOT displayingLastPage THEN
repeatCount ++
Yield( )
Sleep(1)
END IF
LOOP UNTIL displayingLastPage OR (repeatCount >= maxRepeat)
RETURN displayingLastPage
调用此新功能以确保在可用时显示最后一页。如果只返回false,则最后一页无法在1000秒内显示(由常量maxRepeat
定义)
注意:有很多方法可以解决同样的问题。 Yield; Sleep
可能不是您特定情况下的最佳解决方案。
答案 1 :(得分:0)
对于您的特定代码>>>你的TRY-CATCH只能捕获异常 如果GetCurrentPageNumber是罪魁祸首。
这是正确的,因为ShowLastPage永远不是罪魁祸首,并且当报表控件必须花时间滚动到最后一页时会导致一些延迟。在那个延迟期间,如果调用GetCurrentPageNumber,则GetCurrentPageNumber成为罪魁祸首,否则它将起作用。
无论如何,我认为没有充分理由重复访问 FINALLY子句中的GetCurrentPageNumber。这将始终访问 该物业两次。如果FINALLY中的访问引发异常, 那个例外没有被抓住!
是的,这是正确的,FINALLY中不需要GetCurrentPageNumber。 实际上,我正在尝试不同的方式,但每次都知道最终执行。
如果您对ShowLastPage方法的调用在此处引发异常 是我会考虑的(记住“单一责任”):
ShowLastPage方法不会抛出异常但GetCurrentPageNumber会抛出异常(正如我在上面的例子中所提到的)。这是我在您建议的代码中所做的唯一更改。我将代码更改为以下
Boolean _GetCurrentPageNumber()
Long currentPageNumbe = 0
TRY
currentPageNumbe = Long(tab_1.tp_preview.ole_view.object.GetCurrentPageNumber)
RETURN currentPageNumbe
CATCH (RuntimeError exRuntime)
RETURN 0
END TRY
第二种方法:
Long _waitForCurrentPageNumber()
Constant Integer maxRepeat = 1000
Long CurrentPageNumber = 0
Integer repeatCount
DO
CurrentPageNumber = _GetCurrentPageNumber()
IF NOT CurrentPageNumber > 0 THEN
repeatCount += 1
Yield()
Sleep(1)
END IF
LOOP UNTIL CurrentPageNumber > 0 OR repeatCount >= maxRepeat
RETURN CurrentPageNumber
有很多方法可以解决同样的问题。产量;睡眠可能不是 在您的特定情况下的最佳解决方案。
是的但它确实有效:)我检查过,我正在测试的报告中有1到超过42,000页,没有创建崩溃问题。非常感谢所有的建议。