【问题标题】:Inno Setup: How can I get the Exception Code of a raised Exception?Inno Setup:如何获取引发异常的异常代码?
【发布时间】: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()

标签: inno-setup pascalscript


【解决方案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)。

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


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


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

【讨论】:

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