【问题标题】:Any way to recover from a LoadPackage failure?有什么方法可以从 LoadPackage 故障中恢复?
【发布时间】:2011-08-26 05:24:39
【问题描述】:

我正在编写一个使用 SysUtils.LoadPackage 动态加载包的程序。其中一些包是第三方的,表现不佳,在调用 InializePackage 时会失败。

我希望我的程序在这些故障后继续运行。我见过两种不同的行为:

  1. 它从包中的某处引发异常并终止。
  2. 它抛出异常并将控制权返回给调用者,但下次调用 LoadPackage 时,程序停止响应。

关于如何从这些失败中优雅地恢复的任何想法?

【问题讨论】:

  • 并非所有异常都是可恢复的。如果第三方LoadPackage 破坏了应用程序内存,那你就完蛋了。所以这取决于。
  • 嗯,也许我可以在单独的进程中托管每个包。然后,如果进程终止,主应用程序会继续运行。

标签: delphi packages


【解决方案1】:

这可能会增加您的加载时间,但您可以创建一个程序来简单地尝试加载和初始化包并返回您的主应用程序可以解释(可能通过消息)成功/失败的结果。这样,如果失败,它不会关闭您的主应用程序,但是如果成功,您将加载并初始化包两次。

编辑:作为一种优化,您可以存储特定文件名和包版本的成功/失败,以便程序的未来运行速度更快。

【讨论】:

    【解决方案2】:

    您可以编写自己的包加载器。当您忽略所有 IFDEF 时,这是一个非常简短的例程。它基本上加载库,验证它是否加载,然后在 try 块中调用 InitializePackage。如果 InitializePackage 引发异常,它会再次卸载库。如果你有自己的包加载器,你可以随心所欲地处理异常。

    不过,话虽如此,我同意 Craig 的观点,即这不一定是个好主意。如果一个包写得太糟糕以至于它在initialization 部分中爆炸,这应该非常简单以至于不能有任何错误,你真的希望代码运行首先插入你的程序吗?最好的办法可能是尝试让第三方开发人员修复他们损坏的代码。

    【讨论】:

    • 我并不打算运行有缺陷的软件包。我只需要加载它们足够长的时间来收集有关它们的信息以显示给用户。如果包加载失败,它将被标记为不可用。
    • @Kenneth:在这种情况下,您将它们托管在一个单独的进程中的想法可能是最好的解决方案。
    猜你喜欢
    • 2018-02-16
    • 2015-01-29
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2013-11-11
    • 2018-02-09
    • 1970-01-01
    相关资源
    最近更新 更多