3.3.6. Обработка ошибок
 
Такском-Доклайнз .NET SDK кроме стандартных исключений платформы .NET предусматривает специфические исключения следующих типов:
TaxcomApiException: ошибки обработки электронных документов на сервере системы Такском-Доклайнз (например, вызов метода Login()   с некорректным значением параметра Software application ID, назначенным для экземпляра класса TaxcomApi);
TaxcomSdkException: проблемы с установкой и использованием библиотек .NET SDK (например, неправильная установка библиотеки Taxcom CryptoAX).
Перечень API ошибок на стороне сервера Такском-Доклайнз см. в Приложении 2. Коды ошибок (исключения TaxcomApiException).
Если TaxcomApiException или TaxcomSdkException генерируются при  стандартном исключении .NET платформы, исходное исключение представлено в InnerException свойстве сгенерированного объекта.
 
Описание классов исключений
public class TaxcomSdkException : TaxcomException
{
}
 
public class TaxcomApiException : TaxcomException
{
   // Taxcom-Doclnes server side error code
  public int ApiErrorCode { get; set; }
   // HTTP-error code
  public int HttpErrorCode { get; set; }
}
 
public abstract class TaxcomException : Exception
{
   // Error message
   public string Details { get; set; }
}
Пример кода C#
try
{
   Factory factory = new Factory();
   TaxcomApi api = factory.CreateApiFromFiles("https://api-invoice.taxcom.ru/v1.3/", "TaxcomFiler_F9244126-2184-4E43-8F62-F5BB1BEE4418", "C:\\authCert.cer");
  api.Login();
}
catch (TaxcomApiException ex)
{
  // to handle Taxcom-Doclines server side errors
}
catch (TaxcomSdkException ex)
{
  // to
}
catch (Exception ex)
{
  // To handle other errors
}
 
Для получения информации об асинхронной ошибке нужно после отправки документа методом GetDocFlowList получить данные о его  статусе, описание ошибки будет включено в поле сообщения.
Типы и виды ошибок
Вид ошибки
Тип ошибки (ErrorType)
Описание
(ErrorDescription)
Ошибки сертификатов
ImportFailed
Импорт документа с некорректной подписью
Сертификат подписи отсутствует у абонента
Подпись не соответствует переданному файлу. После подписания изменили xml
Ошибки тарификации
DocflowError
Тариф недействителен, нет активных счетчиков
Исчерпан лимит отправок по счетчикам
Ошибки взаимодействия с партнёром
VerificationError
Отправка партнёру,  которого нет в контактах (который не дал согласие на обмен документами)
Ошибки верификации документа
VerificationError
Ошибка форматологического контроля документа, ApiCode="6100"
Неверно указан подписант в документе, ApiCode="6101"
Неверно указан отправитель документе, ApiCode="6102"
Неверно указан получатель документе, ApiCode="6103"
Ошибка в названии файла документа, ApiCode="6104"
Ошибка проверки документа по XSD схеме, ApiCode="6105"
 
Примеры результатов метода GetDocFlowList при наличии ошибок
 
Пример 1. Импорт документа с некорректной подписью:
02.12.2014 9:53:54 - <?xml version="1.0" encoding="utf-8"?><ContainerDescription RequestDateTime="2014-12-02 08:53:54.243" IsLast="true" LastRecordDateTime="2014-12-02 09:53:39.817" xmlns="http://api-invoice.taxcom.ru/meta"><DocFlow Status="Error" ErrorType="ImportFailed" ErrorDescription="Ошибка проверки подписи документа при импорте" StatusChangeDateTime="2014-12-02 09:53:39.817"><Documents><Document><Definition><Identifiers ExternalIdentifier="ON_SFAKT_2AL-8C017440-18CE-4CC2-A6CC-DDCACF38D64C-00000_2AL-0D317DAD-6557-4314-9244-79314A896DFC-00000_20140707_76D13F9A-8BD9-4A9E-9011-9381D87BD011.xml" /></Definition></Document></Documents></DocFlow></ContainerDescription>
 
Пример 2. Сертификат подписи отсутствует у абонента:
02.12.2014 9:56:44 - <?xml version="1.0" encoding="utf-8"?><ContainerDescription RequestDateTime="2014-12-02 08:56:44.583" IsLast="true" LastRecordDateTime="2014-12-02 09:56:35.800" xmlns="http://api-invoice.taxcom.ru/meta"><DocFlow Status="Error" ErrorType="ImportFailed" ErrorDescription="Сертификат (отпечаток 'D223731066C49C088DCAA3A7F652416D020DAD9A'), которым подписан данный документ, отсутствует у абонента." StatusChangeDateTime="2014-12-02 09:56:35.800"><Documents><Document><Definition><Identifiers ExternalIdentifier="ON_SFAKT_2AL-8C017440-18CE-4CC2-A6CC-DDCACF38D64C-00000_2AL-0D317DAD-6557-"></Identifiers>
 
Пример 3. Подпись не соответствует переданному файлу. После подписания изменили xml 
02.12.2014 9:59:57 - <?xml version="1.0" encoding="utf-8"?><ContainerDescription RequestDateTime="2014-12-02 08:59:56.961" IsLast="true" LastRecordDateTime="2014-12-02 09:59:41.813" xmlns="http://api-invoice.taxcom.ru/meta"><DocFlow Status="Error" ErrorType="ImportFailed" ErrorDescription="Подпись для 'ON_SFAKT_2AL-8C017440-18CE-4CC2-A6CC-DDCACF38D64C-00000_2AL-0D317DAD-6557-4314-9244-79314A896DFC-00000_20140707_76D13F9A-8BD9-4A9E-9011-9381D87BD011.xml' не соответствует переданному файлу" StatusChangeDateTime="2014-12-02 09:59:41.813"><Documents><Document><Definition><Identifiers ExternalIdentifier="ON_SFAKT_2AL-8C017440-18CE-4CC2-A6CC-DDCACF38D64C-00000_2AL-0D317DAD-6557-4314-9244-79314A896DFC-00000_20140707_76D13F9A-8BD9-4A9E-9011-9381D87BD011.xml" /></Definition></Document></Documents></DocFlow></ContainerDescription>
 
Пример 4. Тариф недействителен, нет активных счетчиков  
02.12.2014 10:06:23 - <?xml version="1.0" encoding="utf-8"?><ContainerDescription RequestDateTime="2014-12-02 09:06:23.682" IsLast="true" LastRecordDateTime="2014-12-02 10:06:09.300" xmlns="http://api-invoice.taxcom.ru/meta"><DocFlow Id="39ec14c2-c9d9-4735-b6b4-e5100ab92a57" Status="Error" ErrorType="DocflowError" StatusChangeDateTime="2014-12-02 10:06:09.300"><Documents><Document><Definition><Identifiers InternalId="fdd98d77-5822-4c44-9f3f-2aaff996f11f" ExternalIdentifier="ON_SFAKT_2AL-8C017440-18CE-4CC2-A6CC-DDCACF38D64C-00000_2AL-0D317DAD-6557-4314-9244-79314A896DFC-00000_20140707_76D13F9A-8BD9-4A9E-9011-9381D87BD011.xml" /></Definition></Document></Documents></DocFlow></ContainerDescription>
 
Обработка ошибок, возникших при выполнении Регламентов ЭДО (в методе AutoSendReceive)
 
Метод GetErrors()
В каждом экземпляре TaxcomApi присутсвует метод GetErrors(), возвращающий список сообщений об ошибках, возникших при выполнении Регламентов ЭДО на стороне клиента:
object[] GetErrors()
 
В случае, если при выполнении Регламентов ЭДО в методе AutoSendReceive  возникла ошибка, её текст можно будет получить, вызвав метод GetErrors() экземпляра TaxcomApi.
Если, например, с сервера пришла команда подписать документ с использованием сертификата ЭП, отсутствующего на компьютере клиента, данная команда не будет выполнена, а информация об ошибке будет доступна для метода GetErrors(). При этом, ошибка не затронет выполнение других команд, полученных от сервера методом AutoSendReceive.
 
Пример использования:
bool wasAnythingProcessed = api1.AutoSendReceive();
var errors = api1.GetErrors();
 
bool hasErrors = errors.Length > 0;
 
Интерфейс ITaxcomApiErrorHandler
Для получения более подробной информации об ошибках, возникших при выполнении метода AutoSendReceive, необходимо:
1. Реализовать обработчик ошибок, имплементирующий интерфейс ITaxcomApiErrorHandler :
      public class SampleErrorHandler:ITaxcomApiErrorHandler
    {
        public bool OnError(TaxcomApiErrorDescription taxcomApiErrorDescription)
        {
            var exception = taxcomApiErrorDescription.InnerException;
            
            //можно, например, логировать полученное исключение...
            Debug.WriteLine(exception);
            
            /*
             * в зависимости от полученного исключения, интеграционное средство может принять решение 
             * либо остановить последующее выполнение регламентых операций, либо продолжить                
            */
            var processingShouldBeStopped = false
 
            return processingShouldBeStopped;
        }
    }
 
2. Передать экземпляр обработчика ошибок при создании нового экземпляра TaxcomApi:
      var api = new Factory().CreateApi(serviceUrl, useDefaultProxy, clientIdentifier, authCertificateBody, edxClientId, new SampleErrorHandler());