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

Во время исполнения обработчика на встроенном языке при возникновении ошибки может быть выброшено исключение. «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>