Перейти к основному содержимому

Обработка ошибок

Во время исполнения обработчика на встроенном языке при возникновении ошибки может быть выброшено исключение. «1С:Шина» создает из выброшенного обработчиком запроса исключения SOAP ошибку и формирует HTTP-код ответа 500 (Internal server error). В элементе проекта можно описать ошибки (исключения встроенного языка), которые могут быть выброшены обработчиками сервиса. Для таких исключений «1С:Шина» создаст описание SOAP-ошибок в WSDL сервиса. Если обработчик выбрасывает не описанное в элементе проекта исключение, WSDL сервиса не будет содержать описания соответствующей ошибки, а в SOAP-сообщении будет только общая информация о возникшей ошибке, взятая из сообщения выброшенного исключения.

Пример не описанного в проекте исключения

В XBSL-обработчике SOAP-сервиса выбрасывается исключение:

метод ДобавитьВКорзину(): Cart
...
выбросить новый ИсключениеВыполнения("Произошла ошибка при обработке запроса веб-сервиса")
;

Ответ SOAP-сервиса:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<S:Body>
<S:Fault xmlns:ns3="http://www.w3.org/2003/05/soap-envelope">
<faultcode>S:Server</faultcode>
<faultstring>Произошла ошибка при обработке запроса веб-сервиса</faultstring>
</S:Fault>
</S:Body>
</S:Envelope>

Вы также можете создать пользовательское исключение в модуле SOAP-сервиса. Название исключения необходимо указать в свойстве Ошибки. Данное свойство есть как у элемента проекта Soap Сервис, так и у обработчиков операций. Общие для всех обработчиков ошибки следует указать в свойстве элемента проекта, а специфические для конкретного обработчика — в свойстве обработчика.

Из исключения на встроенном языке «1С:Шина» сформирует WSDL описание ошибки (definitions.message, operation.fault).

После того как вы создали пользовательское исключение, вы можете выбрасывать исключение данного типа в обработчиках операций сервиса.

Когда во время исполнения обработчика операции данное исключение будет выброшено, «1С:Шина» сериализует объект-исключение в SOAP Fault сообщение. Если выброшенное исключение не описано для операции (в свойстве Ошибки элемента проекта SoapСервис либо в свойстве Ошибки у вызванного обработчика), будет сформирована обычная ошибка SOAP Fault (см. пример выше).

Пример описанного в проекте исключения

Описание YAML:

ВидЭлемента: SoapСервис
Ид: 20658364-7777-4b14-9423-ec212de5be72
Имя: СервисМагазина
ПространствоИменСервиса: https://mycustomshop.ru
ИмяСервиса: ShopService
КорневойUrl: shopservice
Обработчики:
-
Имя: AddToCart
Метод: ДобавитьВКорзину
Ошибки:
- СервисМагазина.MyCustomException

Модуль SOAP-сервиса:

// Описание пользовательской ошибки
@ВПроекте
исключение MyCustomException
обз пер ReasonDescription: Строка
обз пер AppErrorCode: Число
;

// В обработчике выбрасывается пользовательское исключение
метод ДобавитьВКорзину(): Cart
...
выбросить новый MyCustomException("Пользовательское сообщение об исключении", "Описание ошибки", 224)
;

Ответ SOAP-сервиса:

<?xml version='1.0' encoding='UTF-8'?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header/>
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>Пользовательское сообщение об исключении</faultstring>
<detail>
<n1:MyCustomException xmlns:n1="http://mycompany/myws">
<ReasonDescription>Описание ошибки</ReasonDescription>
<AppErrorCode>224</AppErrorCode>
</n1:MyCustomException>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>