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.

HinweisHinweis

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

  1. 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
    
  2. 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
    
  3. 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

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

  2. 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
    
  3. Anders als bei Verwendung von SOAP über HTTP müssen Sie bei direkter Verknüpfung die SOAP-Protokollversion nicht festlegen.

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

Exemplarische Vorgehensweise: Entwickeln einer benutzerdefinierten Anwendung mithilfe der Excel-Webdienste

Gewusst wie: Abfangen von Ausnahmen

Gewusst wie: Festlegen eines Speicherorts als vertrauenswürdig

Gewusst wie: Speichern im Excel-Client auf dem Server

Konzepte

Zugreifen auf die SOAP-API

Excel Services Alerts

Bekannte Probleme und Tipps für Excel Services

Loopback-SOAP-Aufrufe und direkte Verknüpfung