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