Aracılığıyla paylaş


Hataları İşleme (BITS)

Uygulamanızda işlenmek üzere iki tür hata vardır. İlk hata başarısız bir yöntem çağrısıdır. Her yöntem bir HRESULT değeri döndürür. Her yöntemin başvuru sayfası, oluşturma olasılığı en yüksek olan dönüş değerlerini tanımlar. Ek dönüş değerleri için bkz. BITS Dönüş Değerleri. Dönüş değeriyle ilişkili ileti metnini almak için IBackgroundCopyManager::GetErrorDescription yöntemini çağırın.

Ele alınması gereken ikinci hata türü, durumununBG_JOB_STATE_ERROR veya BG_JOB_STATE_TRANSIENT_ERRORdurumlarına geçiş yaptığı bir iştir. Bu tür hatalarla ilgili bilgileri almak için işin IBackgroundCopyJob::GetError yöntemini çağırın. yöntemi, hatanın nedenini belirlemek için kullandığınız bilgileri içeren bir IBackgroundCopyError arabirim işaretçisi döndürür. Olay bildirimi almak için kaydolarak da hata bildirimi alabilirsiniz. Ayrıntılar için bkz. COM Geri Çağırma kaydetme.

BITS her işi atomik olarak kabul eder. İşteki dosyalardan biri hata oluşturursa, hata çözülene kadar iş hata durumunda kalır. Bu nedenle, hataya neden olan dosyayı işten silemezsiniz. Ancak, hata sunucunun kullanılamamasından veya geçersiz bir uzak dosyadan kaynaklanıyorsa, yeni bir sunucu veya dosya adını tanımlamak için IBackgroundCopyJob3::ReplaceRemotePrefixveya IBackgroundCopyFile2::SetRemoteName yöntemini çağırabilirsiniz.

Hatanın nedenini belirledikten sonra aşağıdaki seçeneklerden birini gerçekleştirin:

Karşıya yükleme-yanıt işi için, hatanın işin karşıya yükleme veya yanıt bölümünde oluşup oluşmadığını belirlemek için BG_JOB_REPLY_PROGRESS yapısının BytesTotal üyesinin değerini denetleyin. Yükleme sırasında, değer BG_SIZE_UNKNOWN ise hata oluştu.

Aşağıdaki örnekte, IBackgroundCopyError arabirim işaretçisinin nasıl alıncağı gösterilmektedir. Örnekte IBackgroundCopyJob arabirim işaretçisinin geçerli olduğu varsayılır.

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