다음을 통해 공유


오류 처리(BITS)

애플리케이션에서 처리할 오류에는 두 가지 유형이 있습니다. 첫 번째 오류는 실패한 메서드 호출입니다. 각 메서드는 HRESULT 값을 반환합니다. 각 메서드에 대한 참조 페이지는 생성 가능성이 가장 높은 반환 값을 식별합니다. 추가 반환 값은 BITS 반환 값을 참조하세요. 반환 값과 연결된 메시지 텍스트를 얻으려면 IBackgroundCopyManager::GetErrorDescription 메서드를 호출합니다.

처리할 두 번째 오류 유형은 상태가 BG_JOB_STATE_ERROR 또는BG_JOB_STATE_TRANSIENT_ERROR 전환되는 작업입니다. 이러한 유형의 오류와 관련된 정보를 검색하려면 작업의 IBackgroundCopyJob::GetError 메서드를 호출합니다. 메서드는 오류의 원인을 확인하는 데 사용하는 정보가 포함된 IBackgroundCopyError 인터페이스 포인터를 반환합니다. 이벤트 알림을 수신하도록 등록하여 오류 알림을 받을 수도 있습니다. 자세한 내용은 COM 콜백 등록을 참조하세요.

BITS는 각 작업을 원자성으로 간주합니다. 작업의 파일 중 하나가 오류를 생성하는 경우 오류가 해결될 때까지 작업이 오류 상태로 유지됩니다. 따라서 작업에서 오류를 일으키는 파일을 삭제할 수 없습니다. 그러나 서버를 사용할 수 없거나 잘못된 원격 파일로 인해 오류가 발생하는 경우 IBackgroundCopyJob3::ReplaceRemotePrefix 또는 IBackgroundCopyFile2::SetRemoteName 메서드를 호출하여 새 서버 또는 파일 이름을 식별할 수 있습니다.

오류의 원인을 파악한 후 다음 옵션 중 하나를 수행합니다.

업로드-회신 작업의 경우 BG_JOB_REPLY_PROGRESS 구조의 BytesTotal 멤버 값을 검사 작업의 업로드 또는 회신 부분에서 오류가 발생했는지 확인합니다. 값이 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.
}