如何在PowerBuilder中压制所有与ole相关的运行时错误

时间:2017-01-27 03:14:02

标签: crystal-reports ole powerbuilder

有没有办法压制所有与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

2 个答案:

答案 0 :(得分:0)

对于您的特定代码>>>如果GetCurrentPageNumber是罪魁祸首,你的TRY-CATCH将只捕获异常。

无论如何,我认为没有充分的理由在FINALLY子句中重复访问GetCurrentPageNumber。这将始终访问该属性两次。如果FINALLY中的访问引发异常,则不会捕获该异常!

如果您对ShowLastPage方法的调用引发异常,我会考虑这一点(考虑到“单一责任”):

  1. 在一个返回布尔值的函数(例如,名为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
    
  2. 使用单独的函数将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
    
  3. 调用此新功能以确保在可用时显示最后一页。如果只返回false,则最后一页无法在1000秒内显示(由常量maxRepeat定义)

  4. 注意:有很多方法可以解决同样的问题。 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页,没有创建崩溃问题。非常感谢所有的建议。