Поделиться через


Использование свойства SubCode для получения кодов ошибок

Дата последнего изменения: 1 мая 2010 г.

Применимо к: SharePoint Server 2010

Службы Excel формируют ошибки в исключении SOAP на основе ошибок, произошедших в службах Excel. Чтобы упростить перехват отдельных состояний ошибки разработчиком, для оповещения служб вычислений Excel предусмотрен связанный код ошибки. Веб-службы Excel возвращают ошибку с использованием свойств класса SoapException.

В следующем примере показан перехват кодов ошибок с использованием свойства SubCode (https://msdn.microsoft.com/ru-ru/library/system.web.services.protocols.soapexception.subcode.aspx) класса SoapException.

ПримечаниеПримечание

Свойство SubCode можно использовать только в Microsoft Visual Studio 2005. В более ранних версиях Visual Studio свойство SubCode отсутствует.

Список кодов ошибок см. в статье Excel Services Error Codes.

Получение кодов ошибок с помощью протокола SOAP

  1. После добавления веб-ссылки в веб-службы Excel добавьте следующую директиву using, чтобы использовать класс SoapException, не указывая полностью его пространство имен:

    using System.Web.Services.Protocols;
    
    Imports System.Web.Services.Protocols
    
  2. Для получения кодов ошибок служб Excel с помощью свойства SubCode следует использовать версию протокола SOAP12. После создания экземпляра прокси-класса веб-служб Excel задайте версию протокола SOAP следующим образом:

    // 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. Для перехвата кодов ошибок с помощью свойства SubCode добавьте в код блок перехвата исключений SOAP, например:

    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
    

Получение кодов ошибок с помощью прямой привязки

  1. При прямой привязке не требуется добавлять веб-ссылку в веб-службы Excel. Однако в этом случае необходимо добавить ссылку на пространство имен System.Web.Services.

  2. После добавления ссылки добавьте в код следующую директиву using, чтобы использовать класс SoapException, не указывая полностью его пространство имен:

    using System.Web.Services.Protocols;
    
    Imports System.Web.Services.Protocols
    
  3. В отличие от использования протокола SOAP по HTTP, при прямой привязке не требуется задавать версию протокола SOAP.

  4. Для перехвата кодов ошибок с помощью свойства SubCode добавьте в код блок перехвата исключений SOAP, например:

    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
    

Пример

В следующей программе (консольное приложение) для получения кодов ошибок используется свойство SubCode. В этой программе в зависимости от перехваченного кода ошибки выполняются различные действия. Например, можно намеренно передать имя несуществующего листа, чтобы вызвать исключение SOAP. В этом случае возвращается следующее сообщение об исключении 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

Надежное программирование

Убедитесь, что добавлена веб-ссылка на доступный сайт веб-служб Excel. Измените выражение using SubCodeExample; таким образом, чтобы оно указывало на соответствующий сайт веб-службы.

Кроме того, при необходимости измените путь к рабочей книге, имя листа и т. д.

См. также

Задачи

Пошаговое руководство. Разработка настраиваемого приложения с помощью веб-служб Excel

Практическое руководство. Перехват исключений

Инструкции по определению надежного расположения

Практическое руководство. Сохранение из клиента Excel на сервер

Концепции

Доступ к API-интерфейсу SOAP

Excel Services Alerts

Известные проблемы и советы по работе со службами Excel

Вызовы SOAP с замыканием на себя и прямая привязка