【问题标题】:How to supress all ole related runtime errors in PowerBuilder如何在 PowerBuilder 中抑制所有与角色相关的运行时错误
【发布时间】:2017-01-27 03:14:02
【问题描述】:

有没有办法抑制所有与 OLE 相关的错误?例如,如果我尝试访问不存在的服务器应用程序的属性,则会出现运行时错误“访问外部对象属性时出错”如何摆脱所有与 OLE 相关的错误?我用过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...CATCH 无法抑制运行时错误消息。

请告诉我该怎么做。

我正在使用 PowerBuilder 12.5 和 Crystal Reports 11.5

【问题讨论】:

    标签: crystal-reports ole powerbuilder


    【解决方案1】:

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

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

    如果您对 ShowLastPage 方法的调用引发异常,我会考虑以下情况(考虑到“单一职责”):

    1. 将对ShowLastPage 的调用封装在一个返回布尔值(true:succeeded, false:failed)的函数(例如,名为of_ShowLastPage)中。

      注意: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 定义)

    注意:有很多方法可以解决相同的问题。 Yield; Sleep 可能不是您特定场景中的最佳解决方案。

    【讨论】:

    • 很好,这让我想到了。请在下面的答案部分中查看详细信息
    • 产量和睡眠始终不是最佳解决方案。当你有一个长时间运行的函数时,你必须等待以正确的方式执行它并使用线程。
    【解决方案2】:

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

    这是正确的,因为 ShowLastPage 绝不是罪魁祸首,并且当报表控件必须花时间滚动到最后一页时会导致一些延迟。在此延迟期间,如果调用 GetCurrentPageNumber,则 GetCurrentPageNumber 将成为罪魁祸首,否则它会起作用。

    无论如何,我认为没有充分的理由重复您访问 FINALLY 子句中的 GetCurrentPageNumber。这将始终访问 财产两次。如果 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 到 42000 多页我正在测试的报告,没有造成崩溃问题。非常感谢所有的建议。

    【讨论】:

      猜你喜欢
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 2011-03-02
      • 1970-01-01
      相关资源
      最近更新 更多