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