Hibák kezelése (BITS)

Az alkalmazásban kétféle hiba kezelhető. Az első hiba egy sikertelen metódushívás. Minden metódus egy HRESULT értéket ad vissza. Az egyes metódusok referenciaoldala azonosítja azokat a visszatérési értékeket, amelyeket a legnagyobb valószínűséggel generál. További visszatérési értékekért lásd BITS visszatérési értékeket. A visszatérési értékhez társított üzenetszöveg lekéréséhez hívja meg a IBackgroundCopyManager::GetErrorDescription metódust.

A második kezelendő hibátípus egy olyan feladat, amelynek a állapota átvált BG_JOB_STATE_ERROR vagy BG_JOB_STATE_TRANSIENT_ERRORállapotba. Az ilyen típusú hibákkal kapcsolatos információk lekéréséhez hívja meg a feladat IBackgroundCopyJob::GetError metódust. A metódus egy IBackgroundCopyError felületmutatót ad vissza, amely a hiba okának meghatározásához használt adatokat tartalmazza. Hibaértesítést is kaphat, ha regisztrál az eseményértesítés fogadására. Részletekért lásd: COM-visszahívás regisztrálása.

A BITS minden feladatot úgy tekint, mint ami atomi. Ha a feladat egyik fájlja hibát okoz, a feladat hibaállapotban marad, amíg meg nem oldja a hibát. Így nem törölheti a hibát okozó fájlt a feladatból. Ha azonban a hibát a kiszolgáló nem érhető el, vagy érvénytelen távoli fájl okozza, meghívhatja a IBackgroundCopyJob3::ReplaceRemotePrefix vagy IBackgroundCopyFile2::SetRemoteName metódust egy új kiszolgáló vagy fájlnév azonosításához.

A hiba okának meghatározása után hajtsa végre az alábbi lehetőségek egyikét:

Feltöltési-válaszfeladat esetén ellenőrizze a BytesTotalBG_JOB_REPLY_PROGRESS-struktúra tagjának értékét annak megállapításához, hogy a hiba a feladat feltöltési vagy válaszrészén történt-e. Hiba történt a feltöltéskor, ha az érték BG_SIZE_UNKNOWN.

Az alábbi példa bemutatja, hogyan kérhet le egy IBackgroundCopyError felületmutatót. A példa feltételezi, hogy az IBackgroundCopyJob felület mutatója érvényes.

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.
}