我正在使用 Delphi (7-2010) 并试图找出一种在释放应用程序形式的同时处理异常的好方法。该应用程序有多个由 Application 对象拥有的表单。当用户注销时,我需要释放所有现有表单,以便不维护用户状态,然后为下一个登录用户显示登录对话框。
有时,尝试释放其中一个表单时会发生异常。这将表单留在内存中,但处于未知/不可用状态,因此我无法为下一个用户重新使用表单,也无法将其从内存中删除。因为表单归应用程序所有,所以我不能直接为下一个用户创建表单的新版本,因为它会导致 VCL 出现“名为 MyForm 的组件已存在”错误,我有点反感无论如何都要在内存中拥有旧的表单实例。
我想看看其他人在这种情况下会怎么做。这里有一些想法:
- 当您遇到这些异常时终止应用程序,因此您一定要擦干净。用户无论如何都要注销,所以他们很可能已经完成了该应用程序。如果需要,可以选择重新启动应用程序。
- 使表单不属于应用程序,因此您可以创建它们的多个实例,并确保至少隐藏任何不可释放/损坏的表单。
- 动态生成每个表单的名称,或者将其设置为空白,因此永远不会有重复的名称,也不会出现来自 VCL 的“已经存在”错误。
- 将应用程序编写得如此出色,以至于在释放对象时永远不会出现异常(不切实际 - 我需要针对意外错误的应急计划)。
我的解决方案是上述最初的想法之一。我在释放表单的循环周围添加了一个 try/except 块,如果出现异常,我将向用户显示错误消息而不引发它,然后调用 ExitProcess(0) 以立即终止应用程序。