Delen via


Fouten afhandelen (BITS)

Er zijn twee soorten fouten die in uw toepassing moeten worden verwerkt. De eerste fout is een mislukte methode-aanroep. Elke methode retourneert een HRESULT- waarde. De referentiepagina voor elke methode identificeert de retourwaarden die waarschijnlijk worden gegenereerd. Zie BITS Return Valuesvoor aanvullende retourwaarden. Als u de berichttekst wilt ophalen die is gekoppeld aan de retourwaarde, roept u de methode IBackgroundCopyManager::GetErrorDescription aan.

Het tweede type error dat moet worden verwerkt, is een taak waarvan de status overgaat naar BG_JOB_STATE_ERROR of BG_JOB_STATE_TRANSIENT_ERROR. Als u informatie over deze typen fouten wilt ophalen, roept u de methode IBackgroundCopyJob::GetError van de taak aan. De methode retourneert een IBackgroundCopyError interfaceaanwijzer die informatie bevat die u gebruikt om de oorzaak van de fout te bepalen. U kunt ook een foutmelding ontvangen door u te registreren om een gebeurtenismelding te ontvangen. Zie Een COM-callback registrerenvoor meer informatie.

BITS beschouwt elke taak als atomisch. Als een van de bestanden in de taak een fout genereert, blijft de taak in een foutstatus totdat de fout is opgelost. Daarom kunt u het bestand dat de fout veroorzaakt niet verwijderen uit de taak. Als de fout echter wordt veroorzaakt doordat de server niet beschikbaar is of een ongeldig extern bestand, kunt u de methode IBackgroundCopyJob3::ReplaceRemotePrefix of IBackgroundCopyFile2::SetRemoteName methode aanroepen om een nieuwe server of bestandsnaam te identificeren.

Nadat u de oorzaak van de fout hebt vastgesteld, voert u een van de volgende opties uit:

Voor een upload-antwoordtaak controleert u de waarde van het lid BytesTotal van de BG_JOB_REPLY_PROGRESS-structuur om te bepalen of de fout is opgetreden in het upload- of reply-gedeelte van de taak. De fout is opgetreden bij het uploaden als de waarde is BG_SIZE_UNKNOWN.

In het volgende voorbeeld ziet u hoe u een IBackgroundCopyError interfaceaanwijzer ophaalt. In het voorbeeld wordt ervan uitgegaan dat de IBackgroundCopyJob interfaceaanwijzer geldig is.

HRESULT hr = 0;
HRESULT hrError = 0;
IBackgroundCopyJob* pJob;
IBackgroundCopyError* pError = NULL;
IBackgroundCopyFile* pFile = NULL;
WCHAR* pszDescription = NULL;
WCHAR* pszRemoteName = NULL;
BG_ERROR_CONTEXT Context;

hr = pJob->GetError(&pError);
if (SUCCEEDED(hr))
{
  //Retrieve the HRESULT associated with the error. The context tells you
  //where the error occurred, for example, in the transport, queue manager, the 
  //local file, or the remote file.
  pError->GetError(&Context, &hrError);  

  //Retrieve a description associated with the HRESULT value.
  hr = pError->GetErrorDescription(LANGIDFROMLCID(GetThreadLocale()), &pszDescription);
  if (SUCCEEDED(hr))
  {
    if (BG_ERROR_CONTEXT_REMOTE_FILE == Context)
    {
      hr = pError->GetFile(&pFile);  
      if (SUCCEEDED(hr))
      {
        hr = pFile->GetRemoteName(&pszRemoteName);
        if (SUCCEEDED(hr))
        {
          //Do something with the information.
          CoTaskMemFree(pszRemoteName);
        }
        pFile->Release();
      }
    }
    CoTaskMemFree(pszDescription);
  }
  pError->Release();
}
else
{
  //Error information is not available.
}