Inno Setup:如何获取引发异常的异常代码?

Posted

技术标签:

【中文标题】Inno Setup:如何获取引发异常的异常代码?【英文标题】:Inno Setup: How can I get the Exception Code of a raised Exception? 【发布时间】:2016-03-21 16:34:45 【问题描述】:

我有以下引发异常的函数:

procedure Test();
var
  WinHttpReq: Variant;
begin
  WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
  try
    WinHttpReq.Open('POST', 'https://tv.eurosport.com/', False);
    WinHttpReq.SetRequestHeader('Content-Type', 'application/json');
    WinHttpReq.Send('');
  except
    MsgBox(GetExceptionMessage, mbError, MB_OK);
  end;
end;

我想以整数形式获取错误,而不是在字符串GetExceptionMessage 中获取错误。

这可能吗?

【问题讨论】:

我想处理 SSL 证书错误,我认为依赖字符串作为常量是不好的做法。 如果没有办法得到错误码那我就靠字符串了。 例如:if ErrorCode = SSL_CERTIFCATE_ERROR then doStuff() 而不是if GetExceptionMessage = 'WinHttp.WinHttpRequest: the host name in the certificate is invalid or does not match' then doStuff() 【参考方案1】:

异常一般没有任何代码。所以没有通用的方法可以从异常中检索代码。

在这种特殊情况下,异常基于 OLE 自动化错误,该错误确实有代码。但是,当 Inno Setup 引发 IDispatch 接口 (OLE) 的异常时,代码不会被保留。


你可以做的是使用IUnknown接口。为此,您需要:

IWinHttpRequest定义一个Pascal风格的接口 定义CLSID_WinHttpRequest 使用CreateComObject(而不是CreateOleObject)实例化对象。 调用定义为function Send(Body: Variant): HResultSend方法 检查返回的HResult 是否为 12038 (ERROR_INTERNET_SEC_CERT_CN_INVALID)。

尤其是第一步是一项庞大且容易出错的任务。


示例和详细信息,请参见:

Examples\CodeAutomation2.iss 在您的 Inno Setup 安装中。 Pascal Scripting: Using COM Automation objects

如果您决定坚持使用错误消息比较,您可以尝试使用FormatMessage function 检索系统/本地化错误消息以进行比较。见How i can retrieve the error description for a WinInet error code from delphi。

【讨论】:

我希望有更简单的东西,那么你建议依靠字符串还是整数呢? 我认为这与异常后我想做什么无关,但我会解释。如果出现证书验证错误,我将在 HTTP 而不是 HTTPS 上尝试相同的请求。在我正在开发的应用程序中,很少有客户端支持 HTTP 但在 HTTPS 上存在证书验证错误。 那么这很重要。正如您可以让WinHttpRequest 忽略证书错误一样,首先避免出现错误。因此您不必检测错误。 无论如何,回答你的问题。正确定义接口非常困难。我什至不会尝试。 我在回答中又添加了一个提示。

以上是关于Inno Setup:如何获取引发异常的异常代码?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 提示符处引发错误后如何获取最后一个异常对象?

如何在OnExceptionAsync c#中获取引发异常的方法名称[重复]

Inno Setup Compiler打包需要管理员权限的程序

如何在 Inno Setup 中获取已执行程序的输出?

inno setup如何打包超过2G的东西

PL/SQL:如何在异常中获取 ORA 代码?