Control de errores (BITS)

Hay dos tipos de errores que se deben controlar en la aplicación. El primer error es una llamada al método con errores. Cada método devuelve un valor HRESULT . La página de referencia de cada método identifica los valores devueltos que es más probable que genere. Para obtener valores devueltos adicionales, vea Valores devueltos de BITS. Para obtener el texto del mensaje asociado al valor devuelto, llame al método IBackgroundCopyManager::GetErrorDescription .

El segundo tipo de error que se va a controlar es un trabajo cuyo estado pasa a BG_JOB_STATE_ERROR o BG_JOB_STATE_TRANSIENT_ERROR. Para recuperar información relacionada con estos tipos de errores, llame al método IBackgroundCopyJob::GetError del trabajo. El método devuelve un puntero de interfaz IBackgroundCopyError que contiene información que se usa para determinar la causa del error. También puede recibir notificaciones de error registrando para recibir notificaciones de eventos. Para obtener más información, consulte Registro de una devolución de llamada COM.

BITS considera que cada trabajo es atómico. Si uno de los archivos del trabajo genera un error, el trabajo permanece en un estado de error hasta que se resuelve el error. Por lo tanto, no puede eliminar el archivo que está causando el error del trabajo. Sin embargo, si el servidor no está disponible o no es un archivo remoto no válido, puede llamar al método IBackgroundCopyJob3::ReplaceRemotePrefix o IBackgroundCopyFile2::SetRemoteName para identificar un nuevo nombre de servidor o archivo.

Después de determinar la causa del error, realice una de las siguientes opciones:

Para un trabajo de carga y respuesta, compruebe el valor del miembro BytesTotal de la estructura de BG_JOB_REPLY_PROGRESS para determinar si se produjo el error en la parte de carga o respuesta del trabajo. El error se produjo en la carga si el valor es BG_SIZE_UNKNOWN.

En el ejemplo siguiente se muestra cómo recuperar un puntero de interfaz IBackgroundCopyError . En el ejemplo se supone que el puntero de interfaz IBackgroundCopyJob es válido.

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