Condividi tramite


Gestione degli errori (BITS)

Esistono due tipi di errori da gestire nell'applicazione. Il primo errore è una chiamata al metodo non riuscita. Ogni metodo restituisce un valore HRESULT . La pagina di riferimento per ogni metodo identifica i valori restituiti che è più probabile generare. Per altri valori restituiti, vedere valori restituiti BITS. Per ottenere il testo del messaggio associato al valore restituito, chiamare il metodo IBackgroundCopyManager::GetErrorDescription.

Il secondo tipo di errore da gestire è un processo il cui stato passa a BG_JOB_STATE_ERROR o BG_JOB_STATE_TRANSIENT_ERROR. Per recuperare informazioni correlate a questi tipi di errori, chiamare il metodo IBackgroundCopyJob::GetError del job. Il metodo restituisce un puntatore a interfaccia IBackgroundCopyError che contiene informazioni utilizzate per determinare la causa dell'errore. È anche possibile ricevere una notifica di errore registrandosi per ricevere la notifica degli eventi. Per informazioni dettagliate, vedere Registrazione di un callback COM.

BITS considera ogni attività atomica. Se uno dei file nel processo genera un errore, il processo rimane in uno stato di errore fino a quando l'errore non viene risolto. Pertanto, non è possibile eliminare il file che causa l'errore dal processo. Tuttavia, se l'errore è causato dal server non disponibile o da un file remoto non valido, è possibile chiamare il metodo IBackgroundCopyJob3::ReplaceRemotePrefix o IBackgroundCopyFile2::SetRemoteName per identificare un nuovo server o un nuovo nome di file.

Dopo aver determinato la causa dell'errore, eseguire una delle opzioni seguenti:

Per un'attività di caricamento-risposta, controllare il valore del membro BytesTotal della struttura BG_JOB_REPLY_PROGRESS per determinare se l'errore si è verificato nella parte di caricamento o nella parte di risposta dell'attività. Errore durante il caricamento se il valore è BG_SIZE_UNKNOWN.

Nell'esempio seguente viene mostrato come recuperare un puntatore all'interfaccia IBackgroundCopyError. Nell'esempio si presuppone che il puntatore dell'interfacciaIBackgroundCopyJobsia valido.

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