Een foutcode ophalen
Net als bij alle toepassingen ontvangt WMI foutcodes van het Windows-besturingssysteem.
Wanneer u een foutcode ontvangt, hebt u de volgende opties:
Bekijk het gebeurtenislogboek.
WMI verzendt foutberichten naar de gebeurtenislogboekservice die de gebeurtenislogboeken controleert om de oorzaak van een fout te bepalen. U kunt de klassen die de gebeurtenislogboekprovider ondersteunt gebruiken om programmatisch toegang te krijgen tot gebeurtenislogboeken.
Haal de foutcode normaal op.
WMI ondersteunt de standaardtechnieken voor het ophalen van foutcodes, com-foutcodes voor C++, en systeemeigen foutobjecten, zoals VBScript-(Err Object) of SWbemLastError als de provider foutinformatie levert.
Zie voor meer informatie Manipuleren van klasse- en instantie-informatie.
In dit onderwerp worden de volgende secties besproken:
Een fout afhandelen met VBScript
Als een aanroep naar WMI via de Scripting-API voor WMI een fout veroorzaakt, hebt u de volgende opties voor toegang tot de foutgegevens:
- Gebruik de systeemeigen foutmechanismen van de scripttaal, bijvoorbeeld in VBScript, gebruik Err Object (VBScript) om foutafhandeling te ondersteunen.
- Maak een SWbemLastError--object om een foutenrapport op te halen.
Het volgende script toont het gebruik van het systeemeigen Err-object (VBScript). Wanneer er een onjuiste waarde voor de procesgreep wordt opgegeven, wordt er een fout gegenereerd.
On Error Resume Next
Set objProcess = GetObject( _
"winmgmts:root\cimv2:Win32_Process.Handle='one'")
Wscript.Echo Err.Number
Notitie
De eigenschap Description van Err Object (VBScript) is leeg wanneer u verbinding maakt met WMI via de moniker winmgmts:. Als u echter verbinding maakt met SWbemLocator, is de beschrijving beschikbaar.
De volgende tabel bevat de eigenschappen van Err Object (VBScript).
Vastgoed | Bevat |
---|---|
beschrijving |
Gelokaliseerde, door mensen leesbare beschrijving van de fout. |
Nummer |
HRESULT geretourneerd door de Scripting API voor WMI. |
bron |
Identificeert het object dat de fout heeft gegenereerd. |
Het volgende script toont het gebruik van een SWbemLastError--object om gedetailleerde foutinformatie te verkrijgen. Houd er rekening mee dat niet alle providers informatie leveren aan SWbemLastError. Zie WbemErrorEnumvoor meer informatie over foutcodes in script.
On Error Resume Next
Set obj = GetObject("winmgmts:root\cimv2:Win32_Process.Handle='one'")
Set LastError = createobject("wbemscripting.swbemlasterror")
Wscript.Echo "Operation = " & LastError.operation & VBCRLF & "ParameterInfo = " _
& LastError.ParameterInfo & VBCRLF & "ProviderName = " & LastError.ProviderName
Een fout verwerken met C++
Een WMI-clienttoepassing kan COM-specifieke of WMI-specifieke fouten ontvangen. De COM-fouten voldoen aan de structuur van COM-foutcodes. Alle WMI-interfaces kunnen een COM-specifieke fout retourneren, behalve de IWbemContext, IWbemClassObjecten IWbemQualifierSet interfaces. Zie Foutafhandelingvoor meer informatie over COM-foutcodes. De referentiepagina's van de WMI-interfaces bevatten de juiste WMI-foutcodes in de sectie Foutcodes.
Een clienttoepassing moet voldoen aan de COM-standaarden voor het controleren van de status en foutcodes. Het belangrijkste verschil dat u moet kiezen, is of u de foutcode wilt ophalen uit een synchrone, semisynchrone of asynchrone aanroep.
Voor toegang tot synchrone en semisynchrone foutberichten met behulp van C++
Haal de foutinformatie op met een aanroep naar de GetErrorInfo COM-functie.
Zorg ervoor dat u GetErrorInfo onmiddellijk aanroept nadat een interfacemethode een fout aangeeft. Dit omvat een van de IWbemCallResult methoden die u aanroept tijdens het verwerken van een semisynchroon proces.
Controleer het geretourneerde COM-foutobject met een aanroep naar de methode IErrorInterface::QueryInterface.
Zorg ervoor dat u IID_WbemClassObject opgeeft voor de parameter riid in de QueryInterface aanroep. De methode QueryInterface retourneert een exemplaar van een WMI-klasse, meestal __ExtendedStatus.
WMI levert het foutobject niet via GetErrorInfo- voor een asynchrone aanroep omdat er geen manier is om te weten wanneer of op welke thread de asynchrone aanroep heeft plaatsgevonden. Daarom kan uw code alleen specifieke fouten afhandelen of de aanroepfout doorgeven via COM.
Notitie
Omdat de callback naar de sink mogelijk niet op hetzelfde verificatieniveau wordt geretourneerd als de client vereist, wordt u aangeraden semisynchroon te gebruiken in plaats van asynchrone communicatie. Zie Een methode aanroepenvoor meer informatie.
Voor toegang tot asynchrone foutberichten met behulp van C++
Haal het COM-foutobject op uit uw implementatie van IWbemObjectSink::SetStatus.
De volgende pseudocode toont een typische implementatie van foutafhandeling voor een clienttoepassing.
HRESULT hRes = SomeMethod; // Check for specific error and status codes. if (hRes == WBEM_E_NOT_FOUND) { // Processing to handle specific error code } else if hRes == WBEM_S_DUPLICATE_OBJECTS { // All other cases, including errors specific to COM } else if (FAILED(hRes)) { }