Gewusst wie: Verwenden der "SubCode"-Eigenschaft zum Abfangen von Fehlercodes
Letzte Änderung: Samstag, 1. Mai 2010
Gilt für: SharePoint Server 2010
Excel Services generiert Fehler in der SOAP-Ausnahme basierend auf Fehlern, die in Excel Services auftreten. Damit Entwickler bestimmte Fehlerbedingungen einfacher erfassen können, hat eine Dienste für Excel-Berechnungen-Warnung einen zugeordneten Fehlercode. Excel-Webdienste gibt dann den Fehler unter Verwendung von Eigenschaften aus der SoapException-Klasse zurück.
In den folgenden Beispielen wird veranschaulicht, wie Sie mithilfe der SubCode-Eigenschaft (https://msdn.microsoft.com/de-de/library/system.web.services.protocols.soapexception.subcode.aspx) der SoapException-Klasse die Fehlercodes erfassen können.
Hinweis |
---|
Damit Sie die SubCode-Eigenschaft einsetzen können, müssen Sie Microsoft Visual Studio 2005 verwenden. In früheren Versionen von Visual Studio ist die SubCode-Eigenschaft nicht vorhanden. |
Eine Liste der Fehlercodes finden Sie unter Excel Services Error Codes.
So erfassen Sie Fehlercodes bei Verwendung von SOAP
Fügen Sie nach dem Hinzufügen eines Webverweises auf den Excel-Webdienste die folgende using-Direktive hinzu, sodass Sie die SoapException-Klasse verwenden können, ohne sie mit einem vollständigen Namespace qualifizieren zu müssen:
using System.Web.Services.Protocols;
Imports System.Web.Services.Protocols
Sollen die Excel Services-Fehlercodes mithilfe der SubCode-Eigenschaft erfasst werden, müssen Sie die SOAP12-Protokollversion verwenden. Legen Sie nach dem Instanziieren der Excel-Webdienste-Proxyklasse die SOAP-Protokollversion wie folgt fest:
// 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
Wenn die Fehlercodes mithilfe der SubCode-Eigenschaft erfasst werden sollen, fügen Sie dem Code einen catch-Block für eine SOAP-Ausnahme hinzu. Ein Beispiel:
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
So erfassen Sie Fehlercodes bei Verwendung von direkter Verknüpfung
Bei direkter Verknüpfung müssen Sie keinen Webverweis auf den Excel-Webdienste hinzufügen. Sie müssen jedoch einen Verweis auf den System.Web.Services-Namespace hinzufügen.
Nach dem Hinzufügen eines Verweises fügen Sie dem Code die folgende using-Direktive hinzu, sodass Sie die SoapException-Klasse verwenden können, ohne sie mit einem vollständigen Namespace qualifizieren zu müssen:
using System.Web.Services.Protocols;
Imports System.Web.Services.Protocols
Anders als bei Verwendung von SOAP über HTTP müssen Sie bei direkter Verknüpfung die SOAP-Protokollversion nicht festlegen.
Wenn die Fehlercodes mithilfe der SubCode-Eigenschaft erfasst werden sollen, fügen Sie dem Code einen catch-Block für eine SOAP-Ausnahme hinzu. Ein Beispiel:
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
Beispiel
Im folgenden Programm (einer Konsolenanwendung) werden die Fehlercodes mithilfe der SubCode-Eigenschaft erfasst. Ausgehend vom erfassten Fehlercode führt das Programm unterschiedliche Aktionen aus. Sie können beispielsweise absichtlich einen nicht vorhandenen Blattnamen übergeben, um eine SOAP-Ausnahme auszulösen. In diesem Fall wird die folgende Fehlermeldung für die SOAP-Ausnahme zurückgegeben:
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
Robuste Programmierung
Achten Sie darauf, dass Sie einen Webverweis auf eine Excel-Webdienste-Website hinzufügen, auf die Sie Zugriff haben. Ändern Sie die using SubCodeExample; -Anweisung so, dass sie auf die Webdienst-Website zeigt, die Sie referenzieren.
Ändern Sie außerdem je nach Bedarf den Arbeitsmappenpfad, den Blattnamen usw.
Siehe auch
Aufgaben
Gewusst wie: Abfangen von Ausnahmen
Gewusst wie: Festlegen eines Speicherorts als vertrauenswürdig
Gewusst wie: Speichern im Excel-Client auf dem Server