Penanganan Kesalahan (BITS)

Ada dua jenis kesalahan yang harus ditangani di aplikasi Anda. Kesalahan pertama adalah panggilan metode yang gagal. Setiap metode mengembalikan nilai HRESULT . Halaman referensi untuk setiap metode mengidentifikasi nilai pengembalian yang kemungkinan besar akan dihasilkan. Untuk nilai pengembalian tambahan, lihat BITS Mengembalikan Nilai. Untuk mendapatkan teks pesan yang terkait dengan nilai pengembalian, panggil metode IBackgroundCopyManager::GetErrorDescription.

Jenis kesalahan kedua yang harus ditangani adalah pekerjaan yang statusnya beralih ke BG_JOB_STATE_ERROR atau BG_JOB_STATE_TRANSIENT_ERROR. Untuk mengambil informasi yang terkait dengan jenis kesalahan ini, panggil metode IBackgroundCopyJob::GetError pekerjaan. Metode mengembalikan penunjuk antarmuka IBackgroundCopyError yang berisi informasi yang Anda gunakan untuk menentukan penyebab kesalahan. Anda juga dapat menerima pemberitahuan kesalahan dengan mendaftar untuk menerima pemberitahuan peristiwa. Untuk detailnya, lihat Mendaftarkan Panggilan Balik COM.

BITS menganggap setiap pekerjaan sebagai atomik. Jika salah satu file dalam pekerjaan menghasilkan kesalahan, pekerjaan tetap dalam status kesalahan hingga kesalahan diselesaikan. Dengan demikian, Anda tidak dapat menghapus file yang menyebabkan kesalahan dari pekerjaan. Namun, jika kesalahan disebabkan oleh server yang tidak tersedia atau file jarak jauh yang tidak valid, Anda dapat memanggil metode IBackgroundCopyJob3::ReplaceRemotePrefix atau IBackgroundCopyFile2::SetRemoteName untuk mengidentifikasi server atau nama file baru.

Setelah menentukan penyebab kesalahan, lakukan salah satu opsi berikut:

Untuk pekerjaan pengunggahan balasan, periksa nilai anggota BytesTotal dari struktur BG_JOB_REPLY_PROGRESS untuk menentukan apakah kesalahan terjadi pada bagian unggahan atau balasan pekerjaan. Kesalahan terjadi pada unggahan jika nilainya BG_SIZE_UNKNOWN.

Contoh berikut menunjukkan cara mengambil penunjuk antarmuka IBackgroundCopyError. Contoh mengasumsikan penunjuk antarmuka IBackgroundCopyJob valid.

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