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): HResult
的Send
方法
检查返回的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#中获取引发异常的方法名称[重复]