【问题标题】:Ignore error message of error-handling?忽略错误处理的错误信息?
【发布时间】:2015-01-20 23:35:49
【问题描述】:

如果在此代码中调用LoadVCLStyle_UnInstall 函数时uninstall.vsf 文件不存在,我如何忽略错误消息框?

我认为使用带有空 ExceptTry 块就足够了,就像在其他语言中一样,但事实并非如此。

// Import the LoadVCLStyle function from VclStylesInno.DLL
procedure LoadVCLStyle_UnInstall(VClStyleFile: String); external 'LoadVCLStyleA@{app}\uninstall.dll stdcall uninstallonly';

//E: Occurs when the uninstaller initializes.
function InitializeUninstall: Boolean;
begin

  Result := True;

  // Initialize the VCL skin style.
  try
    LoadVCLStyle_UnInstall(ExpandConstant('{app}\uninstall.vsf'));
  except 
  finally
  end;

end;

【问题讨论】:

  • 您看到的不是异常,而是引发异常时该插件的消息框shown by。在这种情况下,您可以通过在尝试加载皮肤之前检查FileExists 来解决问题;除了任何其他例外,你都很不走运。 DLL 不得引发任何异常,但在遇到某些问题时不应显示任何对话框,恕我直言。像GetLastError 这样的系统会更好。

标签: installation inno-setup pascal uninstallation pascalscript


【解决方案1】:

已经提到了预先检查文件是否存在的可能性。

用户 TLama 提到问题中的代码不是常规的 Pascal 程序代码,而是 Inno Setup 脚本代码,并且我的回答不适用于这种情况。因为以下文本可能会引起 Pascal 程序员的兴趣,所以我们保留它。

EXCEPT 语句本身不处理异常,它只标记发生错误后程序应继续执行的点。当EXCEPT ... END 块中未处理/捕获异常时,它将被转移到下一个更高的EXCEPT 语句。 (Freepacal 参考指南第 17 章)

我也不认为TRY ... EXCEPT ... FINALLY ... END 会起作用。 EXCEPTFINALLY,不能同时使用。

如果您想捕获异常,您必须执行以下操作:

TRY
  LoadVCLStyle_UnInstall(ExpandConstant('{app}\uninstall.vsf'));
EXCEPT 
  On EWhateverException DO ...;
END;

如果文档中没有定义此错误的异常类,您可以使用以下技巧来查找异常类名称:

TRY
  LoadVCLStyle_UnInstall(ExpandConstant('{app}\uninstall.vsf'));
EXCEPT 
  ON Exception DO WriteLn(ExceptObject.ClassName);
END;

使用ON Exception DO ..,您可以捕获任何异常,但我不建议在特定程序中使用该变体。

【讨论】:

  • 这是错误的。您可能正在考虑像on E: ExceptionClass do 这样的构造,其中E 是将在except 块中获取异常对象的变量。好吧,这些都不适用于 Inno Setup Pascal 脚本。此外,这不会解决该插件的问题(它只是显示消息框;这不是设置中引发的异常)。
  • @TLama - 那么为什么支持 TRY ... EXCEPT?
  • 不支持异常类和on 构造的事实并不意味着拥有try..except 块是没有意义的。您不必过滤 except 块中的某些异常类(这是可选的)。最后,OP 脚本中的异常处理与问题中显示的消息框无关。对这个问题的回答是,当在其中引发异常时,该插件会显示消息框;没有try..except 块将阻止它显示。它在那个插件中被硬编码。
  • 真的,正如@TLama 建议的那样,我已经使用 FileExists 函数解决了这个问题,我承认我没有测试这个解决方案,因为我联系了插件的作者,他似乎已经解决/改变了错误处理。但是感谢这两个家伙,我刚刚将答案标记为已接受,以便为您提供一些帮助:)。再见
猜你喜欢
  • 2012-09-22
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 2018-08-06
  • 2019-01-18
  • 2020-03-03
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多