Gestion des erreurs (BITS)
Il existe deux types d’erreurs à gérer dans votre application. La première erreur est un appel de méthode qui a échoué. Chaque méthode retourne une valeur HRESULT . La page de référence de chaque méthode identifie les valeurs de retour qu’il est le plus susceptible de générer. Pour obtenir des valeurs de retour supplémentaires, consultez bits Return values. Pour obtenir le texte du message associé à la valeur de retour, appelez la méthode IBackgroundCopyManager :: GetErrorDescription .
Le deuxième type d’erreur à gérer est un travail dont l' État passe à _ _ _ erreur d’état de la tâche BG ou à une _ _ _ _ erreur temporaire d’état de travail BG. Pour récupérer les informations relatives à ces types d’erreurs, appelez la méthode méthode ibackgroundcopyjob :: GetError du travail. La méthode retourne un pointeur d’interface IBackgroundCopyError qui contient les informations que vous utilisez pour déterminer la cause de l’erreur. Vous pouvez également recevoir une notification d’erreur en vous inscrivant pour recevoir une notification d’événement. Pour plus d’informations, consultez inscription d’un rappel com.
BITS considère chaque travail comme atomique. Si l’un des fichiers du travail génère une erreur, le travail reste dans un état d’erreur jusqu’à ce que l’erreur soit résolue. Par conséquent, vous ne pouvez pas supprimer le fichier à l’origine de l’erreur du travail. Toutefois, si l’erreur est due au fait que le serveur n’est pas disponible ou qu’il s’agit d’un fichier distant non valide, vous pouvez appeler la méthode IBackgroundCopyJob3 :: ReplaceRemotePrefix ou IBackgroundCopyFile2 :: SetRemoteName pour identifier un nouveau serveur ou nom de fichier.
Après avoir déterminé la cause de l’erreur, effectuez l’une des options suivantes :
- Annulez la tâche en appelant la méthode méthode ibackgroundcopyjob :: Cancel .
- Pour un travail de téléchargement, appelez la méthode méthode ibackgroundcopyjob :: Complete pour enregistrer les fichiers qui ont été transférés correctement avant l’erreur.
- Corrigez l’erreur et appelez la méthode méthode ibackgroundcopyjob :: Resume pour terminer le travail.
Pour une tâche de chargement-réponse, vérifiez la valeur du membre bytesTotal de la structure de progression de la réponse de la _ tâche _ _ BG pour déterminer si l’erreur s’est produite lors du chargement ou de la réponse de la tâche. L’erreur s’est produite lors du téléchargement si la valeur de la taille BG est _ _ inattendue.
L’exemple suivant montre comment récupérer un pointeur d’interface IBackgroundCopyError . L’exemple suppose que le pointeur d’interface méthode ibackgroundcopyjob est valide.
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.
}