Использование свойства 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
После добавления веб-ссылки в веб-службы Excel добавьте следующую директиву using, чтобы использовать класс SoapException, не указывая полностью его пространство имен:
using System.Web.Services.Protocols;
Imports System.Web.Services.Protocols
Для получения кодов ошибок служб 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
Для перехвата кодов ошибок с помощью свойства 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
Получение кодов ошибок с помощью прямой привязки
При прямой привязке не требуется добавлять веб-ссылку в веб-службы Excel. Однако в этом случае необходимо добавить ссылку на пространство имен System.Web.Services.
После добавления ссылки добавьте в код следующую директиву using, чтобы использовать класс SoapException, не указывая полностью его пространство имен:
using System.Web.Services.Protocols;
Imports System.Web.Services.Protocols
В отличие от использования протокола SOAP по HTTP, при прямой привязке не требуется задавать версию протокола SOAP.
Для перехвата кодов ошибок с помощью свойства 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 на сервер