Compartir a través de


Procedimiento para usar la propiedad SubCode para capturar códigos de error

Última modificación: sábado, 01 de mayo de 2010

Hace referencia a: SharePoint Server 2010

Servicios de Excel genera errores en la excepción SOAP basada en los errores producidos en Servicios de Excel. Para que sea más fácil para el programador detectar las condiciones de error específicas, las alertas de Excel Calculation Services tienen un código de error asociado. Por tanto, Servicios web de Excel devuelve el error con propiedades de la clase SoapException.

Los siguientes ejemplos muestran cómo capturar los códigos de error mediante la propiedad SubCode (https://msdn.microsoft.com/es-es/library/system.web.services.protocols.soapexception.subcode.aspx) de la clase SoapException.

Nota

Para poder usar la propiedad SubCode, debe usar Microsoft Visual Studio 2005. La propiedad SubCode no existe en las versiones anteriores de Visual Studio.

Para obtener una lista de códigos de error, consulte Excel Services Error Codes

Para capturar los códigos de error cuando se usa SOAP

  1. Después de agregar una referencia web a Servicios web de Excel, agregue lo siguiente mediante la directiva para que se pueda usar la clase SoapException sin tener que calificarla con un espacio de nombres completo:

    using System.Web.Services.Protocols;
    
    Imports System.Web.Services.Protocols
    
  2. Para capturar los códigos de error de Servicios de Excel mediante la propiedad SubCode, debe usar la versión del protocolo SOAP12. Tras crear instancias en la clase de proxy Servicios web de Excel, establezca la versión del protocolo SOAP de la manera siguiente:

    // 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. Para obtener los códigos de error mediante la propiedad SubCode, agregue un bloque catch de excepción SOAP al código, por ejemplo:

    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
    

Para capturar los códigos de error cuando se usa la vinculación directa

  1. En el escenario de vinculación directa, no tiene que agregar ninguna referencia web a Servicios web de Excel. Sin embargo, tendrá que agregar una referencia al espacio de nombres System.Web.Services.

  2. Después de agregar una referencia, agregue la siguiente directiva using al código, de forma que pueda usar la clase SoapException sin tener que calificarla con un espacio de nombres completo:

    using System.Web.Services.Protocols;
    
    Imports System.Web.Services.Protocols
    
  3. Al contrario que al usar SOAP a través de HTTP, en el escenario de vinculación directa, no necesitará establecer la versión del protocolo SOAP.

  4. Para obtener los códigos de error mediante la propiedad SubCode, agregue un bloque catch de excepción SOAP al código, por ejemplo:

    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
    

Ejemplo

El programa siguiente (una aplicación de consola) usa la propiedad SubCode para capturar los códigos de error. El programa realiza diferentes acciones basadas en el código de error que se detecta. Se puede, por ejemplo, de forma intencionada pasar un nombre de hoja inexistente para desencadenar una excepción de SOAP. En este caso, se devuelve el siguiente mensaje de excepción de SOAP:

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

Programación sólida

Asegúrese de que agrega una referencia web a un sitio de Servicios web de Excel al que tenga acceso. Cambie la instrucción using SubCodeExample; para que apunte al sitio del servicio web al que hace referencia.

Además, realice los cambios a la ruta y nombre de hoja de cálculo del libro según corresponda.

Vea también

Tareas

Tutorial: Desarrollar una aplicación personalizada mediante Excel Web Services

Procedimiento para detectar excepciones

Procedimiento para confiar en una ubicación

Procedimiento para guardar desde el cliente Excel en el servidor

Conceptos

Obtener acceso a la API de SOAP

Excel Services Alerts

Problemas conocidos y sugerencias de Servicios de Excel

Llamadas SOAP de bucle invertido y vinculación directa