2016-03-21 1 views
2

I haben folgende Funktion, die eine Ausnahme aufwirft:Inno Setup: Wie kann ich den Ausnahmecode einer ausgelösten Ausnahme erhalten?

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; 

Statt der Fehler in einer Zeichenfolge zu erhalten GetExceptionMessage, ich möchte den Fehler als eine Ganzzahl erhalten.

Ist das möglich?

+0

Ich würde gerne mit dem SSL-Zertifikat-Fehler umgehen und ich denke, sich auf eine Zeichenfolge als Konstante zu verlassen ist eine schlechte Praxis. – yuval

+0

Wenn es keinen Weg gibt, den Fehlercode zu bekommen, werde ich mich auf die Zeichenfolge verlassen. – yuval

+0

Zum Beispiel: 'if ErrorCode = SSL_CERTIFCATE_ERROR dann doStuff()' und nicht 'if GetExceptionMessage = 'WinHttp.WinHttpRequest: der Hostname im Zertifikat ist ungültig oder stimmt nicht' dann doStuff() ' – yuval

Antwort

1

Ausnahmen haben im Allgemeinen keinen Code. Es gibt also keine allgemeine Möglichkeit, einen Code von einer Ausnahme abzurufen.

In diesem speziellen Fall basiert die Ausnahme auf einem OLE-Automatisierungsfehler, der über einen Code verfügt. Der Code wird jedoch nicht beibehalten, wenn das Inno-Setup die Ausnahme für IDispatch Schnittstellen (OLE) auslöst.


Was Sie tun können, ist die IUnknown Schnittstelle zu verwenden. Dafür müssen Sie:

  • eine Pascal-Stil-Schnittstelle für die
  • definieren CLSID_WinHttpRequest
  • das Objekt mit dem CreateComObject (anstelle der CreateOleObject) instanziiert IWinHttpRequest definieren.
  • Aufruf der Methode definiert als Sendfunction Send(Body: Variant): HResult
  • Prüfung der zurück HResult für 12038 (ERROR_INTERNET_SEC_CERT_CN_INVALID).

Vor allem der erste Schritt ist eine große und eine fehleranfällige Aufgabe.


Beispiele und Details finden Sie unter:


Wenn Sie sich entscheiden, mit Fehlermeldung Vergleich zu bleiben, können Sie versuchen, die FormatMessage function zu verwenden, um das System/lokalisierte Fehlermeldung mit vergleichen abzurufen. Siehe How i can retrieve the error description for a WinInet error code from delphi.

+0

Ich hatte auf etwas Einfacheres gehofft Was empfehlen Sie, sich auf die Zeichenkette oder die ganze Zahl zu verlassen? – yuval

+0

Ich denke nicht, dass es relevant ist, was ich nach der Ausnahme machen möchte, aber trotzdem werde ich erklären. Wenn ein Fehler bei der Überprüfung des Zertifikats vorliegt, versuche ich dieselbe Anfrage über HTTP und nicht über HTTPS. In der Anwendung, die ich entwickle, gibt es seltene Instanzen von Clients, die HTTP unterstützen, aber HTTPS haben Fehler bei der Zertifikatsüberprüfung. – yuval

+0

Nun, es zählt dann. Da Sie mit dem 'WinHttpRequest' Zertifikatsfehler ignorieren können, vermeiden Sie es, den Fehler an erster Stelle zu bekommen.Sie müssen den Fehler also nicht erkennen. –

Verwandte Themen