Поделиться через


Обработка ошибок (BITS)

В вашем приложении есть два типа ошибок, с которыми нужно справляться. Первая ошибка — вызов неудачного метода. Каждый метод возвращает значение HRESULT. Эталонная страница для каждого метода определяет возвращаемые значения, которые, скорее всего, будут создаваться. Дополнительные возвращаемые значения см. в разделе "Возвращаемые значения BITS". Чтобы получить текст сообщения, связанный со возвращаемым значением, вызовите метод IBackgroundCopyManager::GetErrorDescription.

Второй тип ошибки, который следует обрабатывать, — это задание, состояние которого переходит на BG_JOB_STATE_ERROR или BG_JOB_STATE_TRANSIENT_ERROR. Чтобы получить информацию, связанную с этими типами ошибок, вызовите метод задания IBackgroundCopyJob::GetError. Метод возвращает указатель интерфейса IBackgroundCopyError, содержащий сведения, используемые для определения причины ошибки. Вы также можете получать уведомления об ошибках, регистрируясь для получения уведомления о событии. Дополнительные сведения см. в разделе Регистрация обратного вызова COM.

BITS считает, что каждое задание является атомарным. Если один из файлов в задании создает ошибку, задание остается в состоянии ошибки до устранения ошибки. Таким образом, невозможно удалить файл, вызывающий ошибку из задания. Однако если ошибка вызвана отсутствием доступа к серверу или недопустимым удаленным файлом, можно вызвать метод IBackgroundCopyJob3::ReplaceRemotePrefix или IBackgroundCopyFile2::SetRemoteName для идентификации нового сервера или имени файла.

После определения причины ошибки выполните один из следующих вариантов:

  • Отмените задание, вызвав метод IBackgroundCopyJob::Cancel.
  • Для задания скачивания вызовите метод IBackgroundCopyJob::Complete, чтобы сохранить файлы, которые успешно переданы до возникновения ошибки.
  • Исправьте ошибку и вызовите метод IBackgroundCopyJob::Resume, чтобы завершить задание.

Для задания отправки и ответа проверьте значение элемента BytesTotal структуры BG_JOB_REPLY_PROGRESS, чтобы определить, произошла ли ошибка в части отправки или ответа задания. Ошибка возникает при загрузке, если значение BG_SIZE_UNKNOWN.

В следующем примере показано, как получить указатель интерфейса IBackgroundCopyError. В примере предполагается, что указатель интерфейса IBackgroundCopyJob является допустимым.

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