Share via


Behandeln von Fehlern (BITS)

Es gibt zwei Arten von Fehlern, die in Ihrer Anwendung behandelt werden müssen. Der erste Fehler ist ein fehlerhafter Methodenaufruf. Jede Methode gibt einen HRESULT-Wert zurück. Die Verweisseite für jede Methode identifiziert die Rückgabewerte, die sie wahrscheinlich generieren wird. Weitere Rückgabewerte finden Sie unter BITS-Rückgabewerte. Um den dem Rückgabewert zugeordneten Nachrichtentext abzurufen, rufen Sie die IBackgroundCopyManager::GetErrorDescription-Methode auf.

Der zweite zu behandelnde Fehlertyp ist ein Auftrag, dessen Zustand in BG_JOB_STATE_ERROR oder BG_JOB_STATE_TRANSIENT_ERROR übergeht. Um Informationen im Zusammenhang mit diesen Fehlertypen abzurufen, rufen Sie die IBackgroundCopyJob::GetError-Methode des Auftrags auf. Die -Methode gibt einen IBackgroundCopyError-Schnittstellenzeiger zurück, der Informationen enthält, die Sie zum Ermitteln der Fehlerursache verwenden. Sie können auch Fehlerbenachrichtigungen erhalten, indem Sie sich registrieren, um Ereignisbenachrichtigungen zu erhalten. Ausführliche Informationen finden Sie unter Registrieren eines COM-Rückrufs.

BITS betrachtet jeden Auftrag als atomar. Wenn eine der Dateien im Auftrag einen Fehler generiert, bleibt der Auftrag in einem Fehlerzustand, bis der Fehler behoben ist. Daher können Sie die Datei, die den Fehler verursacht, nicht aus dem Auftrag löschen. Wenn der Fehler jedoch dadurch verursacht wird, dass der Server nicht verfügbar ist oder eine ungültige Remotedatei vorhanden ist, können Sie die IBackgroundCopyJob3::ReplaceRemotePrefix - oder IBackgroundCopyFile2::SetRemoteName-Methode aufrufen, um einen neuen Server oder Dateinamen zu identifizieren.

Nachdem Sie die Fehlerursache ermittelt haben, führen Sie eine der folgenden Optionen aus:

Überprüfen Sie bei einem Upload-Antwort-Auftrag den Wert des BytesTotal-Members der BG_JOB_REPLY_PROGRESS-Struktur , um zu ermitteln, ob der Fehler im Upload- oder Antwortteil des Auftrags aufgetreten ist. Der Fehler ist beim Hochladen aufgetreten, wenn der Wert BG_SIZE_UNKNOWN ist.

Das folgende Beispiel zeigt, wie Sie einen IBackgroundCopyError-Schnittstellenzeiger abrufen. Im Beispiel wird davon ausgegangen, dass der IBackgroundCopyJob-Schnittstellenzeiger gültig ist.

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