Partager via


Procédure : utiliser la propriété SubCode pour capturer des codes d'erreur

Services Excel génère des erreurs dans l'exception SOAP sur la base des erreurs qui se produisent dans Services Excel. Pour que le développeur puisse plus facilement intercepter les conditions d'erreur, une alerte Excel Calculation Services a un code d'erreur associé. Services Web Excel renvoie alors l'erreur à l'aide de propriétés provenant de la classe SoapException.

Les exemples suivants montrent comment capturer les codes d'erreur à l'aide de la propriété SubCode (https://msdn2.microsoft.com/en-us/library/system.web.services.protocols.soapexception.subcode.aspx) de la classe SoapException.

Notes

Pour pouvoir utiliser la propriété SubCode, vous devez utiliser Microsoft Visual Studio 2005. La propriété SubCode n'existe pas dans les versions antérieures de Visual Studio.

Pour une liste des codes d'erreur, voir Codes d'erreurs Excel Services.

Pour capturer des codes d'erreur lors de l'utilisation de SOAP

  1. Après avoir ajouté une référence Web aux Services Web Excel, ajoutez la directive suivante pour pouvoir utiliser la classe SoapException sans devoir la qualifier avec un espace de noms complet :

    using System.Web.Services.Protocols;
    
  2. Pour capturer les codes d'erreur d'Services Excel à l'aide de la propriété SubCode, vous devez utiliser la version du protocole SOAP12. Après avoir instancié la classe de proxy des Services Web Excel, définissez la version du protocole SOAP comme suit :

    // Instantiate the Web service. 
     ExcelService xlservice = new ExcelService();
    
    // Set the SOAP protocol version.           
    xlservice.SoapVersion = SoapProtocolVersion.Soap12;
    
  3. Pour intercepter les codes d'erreur à l'aide de la propriété SubCode, ajoutez un bloc catch d'exception SOAP à votre code, par exemple :

    catch (SoapException e)
    {
        Console.WriteLine("SOAP Exception Message: {0}", e.Message);
        Console.WriteLine("SOAP Exception Error Code: {0}", 
            e.SubCode.Code.Name);
    }
    

Pour capturer des codes d'erreur lors de l'utilisation de liaisons directes

  1. Dans le scénario des liaisons directes, il n'est pas nécessaire d'ajouter une référence Web aux Services Web Excel. Cependant, vous devez ajouter une référence à l'espace de noms System.Web.Services.

  2. Après avoir ajouté une référence, ajoutez la directive using suivante à votre code pour pouvoir utiliser la classe SoapException sans devoir la qualifier avec un espace de noms complet :

    using System.Web.Services.Protocols;
    
  3. Contrairement à l'utilisation de SOAP avec HTTP, dans le scénario des liaisons directes, il n'est pas nécessaire de définir la version du protocole SOAP.

  4. Pour intercepter les codes d'erreur à l'aide de la propriété SubCode, ajoutez un bloc catch d'exception SOAP à votre code, par exemple :

    catch (SoapException e)
    {
        Console.WriteLine("SOAP Exception Message: {0}", e.Message);
        Console.WriteLine("SOAP Exception Error Code: {0}", 
            e.SubCode.Code.Name);
    }
    

Exemple

Le programme suivant (une application console) utilise la propriété SubCode pour capturer les codes d'erreur. Le programme effectue différentes actions selon le code d'erreur intercepté. Vous pouvez par exemple passer intentionnellement un nom de feuille qui n'existe pas pour déclencher une exception SOAP. Dans ce cas, l'exception SOAP suivante est renvoyée :

The sheet that was requested could not be found. Please try a different one.
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.Services.Protocols;
using System.Threading;
using SubCodeExample;

namespace SubCodeExample
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length != 3)
            {
                Console.WriteLine("This program requires 3 parameters - 
                    workbook, sheet and cell");
            }
            string workbookUrl = args[0];
            string sheetName = args[1];
            string cellRange = args[2];

            const string DataRefreshError = 
                "ExternalDataRefreshFailed";
            const string InvalidSheetNameError = "InvalidSheetName";
            const string FileOpenNotFound = "FileOpenNotFound";

            string sessionId = null;
            MyXlServices.ExcelService service = null;
            try
            {
                MyXlServices.Status[] status;
                service = new 
                    SubCodeExample.MyXlServices.ExcelService();
                service.SoapVersion = SoapProtocolVersion.Soap12;
                service.Credentials = 
                    System.Net.CredentialCache.DefaultCredentials;
                sessionId = service.OpenWorkbook(workbookUrl, "", "", 
                    out status);

                object result = service.GetCellA1(sessionId, sheetName, 
                    cellRange, true, out status);
                Console.WriteLine("GetCell result was:{0}", result);

                int retries = 3;
                while (retries > 0)
                {
                    try
                    {
                        service.Refresh(sessionId, "");
                    }
                    catch (SoapException soapException)
                    {
                        bool rethrow = true;
                        if (soapException.SubCode.Code.Name == 
                            DataRefreshError)
                        {
                            if (retries > 1)
                            {
                                Console.WriteLine("Error when 
                                    refreshing. Retrying...");
                                Thread.Sleep(5000);
                                rethrow = false;
                            }
                        }
                        if (rethrow) throw;
                    }
                    retries--;
                }
                
            }
            catch (SoapException exception)
            {
                string subCode = exception.SubCode.Code.Name;
                if (subCode == FileOpenNotFound)
                {
                    Console.WriteLine("The workbook could not be found. 
                        Change the first argument to be 
                        a valid file name.");
                }
                else if (subCode == DataRefreshError)
                {
                    Console.WriteLine("Could not refresh 
                        the workbook.");
                }
                else if (subCode == InvalidSheetNameError)
                {
                    Console.WriteLine("The sheet that was requested 
                        could not be found. Please try 
                        a different one.");
                }
                else
                {
                    Console.WriteLine("Unknown error code returned from 
                        Excel Services:{0}", subCode);
                }
            }
            
            catch (Exception)
            {
                Console.WriteLine("Unknown exception was raised.");
            }
            finally
            {
                if (service != null && 
                    !String.IsNullOrEmpty(sessionId))
                {
                    try
                    {
                        service.CloseWorkbook(sessionId);
                    }
                    catch
                    {
                    }
                }
            }
        }
    }
}

Programmation fiable

Assurez-vous d'ajouter une référence Web à un site de Services Web Excel auquel vous pouvez accéder. Changez l'instruction using SubCodeExample; de façon à pointer vers le site de service Web que vous référencez.

Modifiez également de façon appropriée le chemin d'accès du classeur, le nom de la feuille, etc.

Voir aussi

Autres ressources

Accès à l'API SOAP
Alertes Excel Services
Problèmes connus et conseils relatifs à Excel Services
Appels SOAP de retour de boucle et liaison directe
Procédure pas à pas : développement d'une application personnalisée à l'aide des services Web Excel
Procédure : intercepter des exceptions
How to: Capture Status Return Values
Procédure : approuver un emplacement
Procédure : approuver les emplacements des classeurs à l'aide de scripts
Procédure : enregistrer sur le serveur à partir du client Excel