Обработка ошибок (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.
}