Partager via


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

Dernière modification : samedi 1 mai 2010

S’applique à : SharePoint Server 2010

Excel Services génère des erreurs dans l'exception SOAP sur la base des erreurs qui se produisent dans Excel Services. Pour que le développeur puisse plus facilement intercepter les conditions d'erreur, une alerte Excel Calculation Services a un code d'erreur associé. Excel Web Services 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://msdn.microsoft.com/fr-fr/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 Excel Services Error Codes.

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

  1. Après avoir ajouté une référence Web aux Excel Web Services, 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;
    
    Imports System.Web.Services.Protocols
    
  2. Pour capturer les codes d'erreur d'Excel Services à l'aide de la propriété SubCode, vous devez utiliser la version du protocole SOAP12. Après avoir instancié la classe de proxy des Excel Web Services, 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;
    
    ' Instantiate the Web service. 
     Dim xlservice As 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);
    }
    
    Catch e As SoapException
        Console.WriteLine("SOAP Exception Message: {0}", e.Message)
        Console.WriteLine("SOAP Exception Error Code: {0}", e.SubCode.Code.Name)
    End Try
    

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 Excel Web Services. 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;
    
    Imports 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);
    }
    
    Catch e As SoapException
        Console.WriteLine("SOAP Exception Message: {0}", e.Message)
        Console.WriteLine("SOAP Exception Error Code: {0}", e.SubCode.Code.Name)
    End Try
    

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
                    {
                    }
                }
            }
        }
    }
}
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Web.Services.Protocols
Imports System.Threading
Imports SubCodeExample

Namespace SubCodeExample
    Friend Class Program
        Shared Sub Main(ByVal args() As String)
            If args.Length <> 3 Then
                Console.WriteLine("This program requires 3 parameters - workbook, sheet and cell")
            End If
            Dim workbookUrl As String = args(0)
            Dim sheetName As String = args(1)
            Dim cellRange As String = args(2)

            Const DataRefreshError As String = "ExternalDataRefreshFailed"
            Const InvalidSheetNameError As String = "InvalidSheetName"
            Const FileOpenNotFound As String = "FileOpenNotFound"

            Dim sessionId As String = Nothing
            Dim service As MyXlServices.ExcelService = Nothing
            Try
                Dim status() As MyXlServices.Status
                service = New SubCodeExample.MyXlServices.ExcelService()
                service.SoapVersion = SoapProtocolVersion.Soap12
                service.Credentials = System.Net.CredentialCache.DefaultCredentials
                sessionId = service.OpenWorkbook(workbookUrl, "", "", status)

                Dim result As Object = service.GetCellA1(sessionId, sheetName, cellRange, True, status)
                Console.WriteLine("GetCell result was:{0}", result)

                Dim retries As Integer = 3
                Do While retries > 0
                    Try
                        service.Refresh(sessionId, "")
                    Catch soapException As SoapException
                        Dim rethrow As Boolean = True
                        If soapException.SubCode.Code.Name = DataRefreshError Then
                            If retries > 1 Then
                                Console.WriteLine("Error when refreshing. Retrying...")
                                Thread.Sleep(5000)
                                rethrow = False
                            End If
                        End If
                        If rethrow Then
                            Throw
                        End If
                    End Try
                    retries -= 1
                Loop

            Catch exception As SoapException
                Dim subCode As String = exception.SubCode.Code.Name
                If subCode = FileOpenNotFound Then
                    Console.WriteLine("The workbook could not be found. Change the first argument to be a valid file name.")
                ElseIf subCode = DataRefreshError Then
                    Console.WriteLine("Could not refresh the workbook.")
                ElseIf subCode = InvalidSheetNameError Then
                    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)
                End If

            Catch e1 As Exception
                Console.WriteLine("Unknown exception was raised.")
            Finally
                If service IsNot Nothing AndAlso (Not String.IsNullOrEmpty(sessionId)) Then
                    Try
                        service.CloseWorkbook(sessionId)
                    Catch
                    End Try
                End If
            End Try
        End Sub
    End Class
End Namespace

Programmation fiable

Assurez-vous d'ajouter une référence Web à un site de Excel Web Services 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

Tâches

Procédure pas à pas : développement d'une application personnalisée à l'aide des services Web Excel

Procédure : intercepter des exceptions

Procédure : Approuver un emplacement

Procédure : Enregistrer sur le serveur à partir du client Excel

Concepts

Accès à l'API SOAP

Excel Services Alerts

Problèmes connus et conseils Excel Services

Appels SOAP de retour de boucle et liaison directe