Error and warning codes

Реализация алгоритма экспоненциальной выдержки

В рамках алгоритма экспоненциальной выдержки клиент постепенно увеличивает интервалы между попытками выполнить ошибочный запрос. Это стандартная стратегия обработки ошибок в сетевых приложениях является обязательной для клиентов Management API. Кроме того, она позволяет более эффективно использовать пропускную способность, сократить количество запросов, необходимое для получения успешного ответа, а также увеличить количество параллельно выполняемых в среде запросов.


Простейший алгоритм экспоненциальной выдержки реализуется следующим образом.

  1. Выполняется запрос к API.
  2. Возвращается ответ с кодом ошибки и информацией для повторного выполнения.
  3. Реализуется задержка величиной 1 +  с.
  4. Запрос повторяется.
  5. Возвращается ответ с кодом ошибки и информацией для повторного выполнения.
  6. Реализуется задержка величиной 2 +  с.
  7. Запрос повторяется.
  8. Возвращается ответ с кодом ошибки и информацией для повторного выполнения.
  9. Реализуется задержка величиной 4 +  с.
  10. Запрос повторяется.
  11. Возвращается ответ с кодом ошибки и информацией для повторного выполнения.
  12. Реализуется задержка величиной 8 +  с.
  13. Запрос повторяется.
  14. Возвращается ответ с кодом ошибки и информацией для повторного выполнения.
  15. Реализуется задержка величиной 16 +  с.
  16. Запрос повторяется.
  17. Если запрос по-прежнему не удается выполнить, повторные попытки прекращаются, и регистрируется ошибка.

Атрибут определяет случайную задержку величиной не более 1000 мс и позволяет предотвратить ошибки блокировки в некоторых параллельных реализациях. Значение атрибута переопределяется после каждого периода ожидания.

Примечание. Величина задержки всегда определяется по формуле (2^n) + , где n – это целое число, которое изначально равно 0 и монотонно увеличивается на 1 после каждой итерации, то есть после каждого запроса.

По умолчанию выполнение алгоритма прекращается при n=5, которое соответствует общей задержке около 32 с. Это ограничение позволяет предотвратить бесконечные попытки выполнить запрос и свидетельствует о наличии неустранимой ошибки.

Ниже приведен пример реализации этого алгоритма на языке Python для обработки ошибок в методе .

import random
import time
from apiclient.errors import HttpError

def makeRequestWithExponentialBackoff(analytics):
  """Wrapper to request Google Analytics data with exponential backoff.

  The makeRequest method accepts the analytics service object, makes API
  requests and returns the response. If any error occurs, the makeRequest
  method is retried using exponential backoff.

  Args:
    analytics: The analytics service object

  Returns:
    The API response from the makeRequest method.
  """
  for n in range(0, 5):
    try:
      return makeRequest(analytics)

    except HttpError, error:
      if error.resp.reason in :
        time.sleep((2 ** n) + random.random())
      else:
        break

  print "There has been an error, the request never succeeded."

Локальное развертываниеLocal deployment

Локальное развертывание универсальной CRT поддерживается, хотя и не рекомендуется по соображениям безопасности и производительности.Local deployment of the Universal CRT is supported, but not recommended for both performance and security reasons. Библиотеки DLL для локального развертывания входят в состав пакета Windows SDK и находятся в подкаталоге Kits\10\Redist\ucrt\DLLs согласно архитектуре компьютера.The DLLs for local deployment are included as part of the Windows SDK, in the Windows Kits\10\Redist\ucrt\DLLs subdirectory, by computer architecture. Требуемые библиотеки DLL содержат ucrtbase.dll и набор библиотек DLL переадресации APISet с именем api-ms-win-*.dll.The DLLs required include ucrtbase.dll and a set of APISet forwarder DLLs named api-ms-win-*.dll. Изменяется набор библиотек DLL, необходимых для каждой операционной системы.The set of DLLs required on each operating system varies. Настоятельно рекомендуется включать все библиотеки DLL при развертывании локально.It’s highly recommended that you include all of the DLLs when you deploy locally.

Для локального развертывания существует два ограничения, которые следует учитывать:There are two restrictions on local deployment to be aware of:

  • В Windows 10 универсальная CRT, расположенная в системном каталоге, используется всегда, даже если приложение имеет собственную локальную копию универсальной CRT.On Windows 10, the Universal CRT in the system directory is always used, even if an application includes an application-local copy of the Universal CRT. Верно, даже в том случае, если локальная копия новее, поскольку универсальной среды Выполнения является основным компонентом операционной системы в Windows 10.It’s true even when the local copy is newer, because the Universal CRT is a core operating system component on Windows 10.

  • В версиях Windows до Windows 8, универсальной среды Выполнения не могут быть упакованы локально с помощью подключаемого модуля, если он находится в каталоге, отличном от каталог основного исполняемого файла приложения.On versions of Windows before Windows 8, the Universal CRT can’t be packaged locally with a plugin, if it’s located in a directory other than the directory of the main app executable. В этом случае библиотеки DLL сервера пересылки APISet не могут успешно разрешить ucrtbase.dll.The APISet forwarder DLLs are unable to resolve the ucrtbase.dll successfully in this case. К рекомендуемым альтернативным способам относятся следующие.Some recommended alternative solutions include:

    • Статическая компоновка универсальной CRT.Statically link the Universal CRT,
    • Централизованное развертывание универсальной CRT.Centrally deploy the Universal CRT, or
    • Помещение файлов универсальной CRT в один каталог с приложением.Place the Universal CRT files in the same directory as the app.

Обрывистые сети

Веб-клиент, над которым я работаю, используется в школьных сетях, которые бывают совершенно ужасны. Доступность бэкенда едва ли имеет к этому какое-то отношение. Запрос иногда не выходит из школьной сети.

Для решения такого рода периодических проблем с сетью, мы добавили axios-retry, что решило большое количество ошибок, которые мы наблюдали в продакшне. Это было добавлено в нашу настройку axios:

const _axios = require('axios') const axiosRetry = require('axios-retry') const axios = _axios.create() // https://github.com/softonic/axios-retry/issues/87 const retryDelay = (retryNumber = 0) => {   const seconds = Math.pow(2, retryNumber) * 1000;   const randomMs = 1000 * Math.random();   return seconds + randomMs; }; axiosRetry(axios, {   retries: 2,   retryDelay,   // retry on Network Error & 5xx responses   retryCondition: axiosRetry.isRetryableError, }); module.exports = axios;

Мы увидели, что 10% наших пользователей (которые находятся в плохих школьных сетях) периодически наблюдали ошибки сети, но число снизилось до <2% после добавления автоматических повторных попыток при сбое.

Скриншот количества ошибок сети, как они появляются в браузере New Relic. <1% запросов неверны. Это подводит меня к последнему пункту.

Examples

The above practices are common throughout some of the most popular REST APIs. While the specific names of fields or formats may vary between sites, the general patterns are nearly universal.

4.1. Twitter

For example, let’s send a GET request without supplying the required authentication data:

The Twitter API responds with an error with the following body:

This response includes a list containing a single error, with its error code and message. In Twitter’s case, no detailed message is present and a general error — rather than a more specific 401 error — is used to denote that authentication failed.

Sometimes a more general status code is easier to implement, as we’ll see in our Spring example below. It allows developers to catch groups of exceptions and not differentiate the status code that should be returned. When possible, though, the most specific status code should be used.

4.2. Facebook

Similar to Twitter, Facebook’s Graph REST API also includes detailed information in its responses.

For example, let’s perform a POST request to authenticate with the Facebook Graph API:

We receive the following error:

Like Twitter, Facebook also uses a generic error — rather than a more specific 400-level error — to denote a failure. In addition to a message and numeric code, Facebook also includes a type field that categorizes the error and a trace ID (fbtrace_id) that acts as an internal support identifier.

Common errors

When you make a call to an eBay API, you can get a response that contains errors or warnings as described above. However, each API can also return common errors, which are error conditions that can occur while processing a call to any API. Common errors stop processing and they must be addressed before you can get a successful response from your call.

The common errors use the same error response structure that the individual interfaces use:

  {
    "errors": ,
        "outputRefIds": ,
        "parameters": 
      }
    ]
  }

Below is a list of the most frequently encountered common errors:

Common error messages

Error ID

Error Category

Message

Long Message

Domain

HTTP Status Code

1001

REQUEST

Invalid access token

Invalid access token. Check the value of the Authorization HTTP request header.

OAuth

401

1002

REQUEST

Missing access token

Access token is missing in the Authorization HTTP request header.


OAuth

400

1003

REQUEST

«Token type in the Authorization header is invalid:» + scheme

«Token type in the Authorization header is invalid:» plus scheme

OAuth

400

1004

REQUEST

Internal error

Error process the access token.

OAuth

500

1100

REQUEST

Access denied

Insufficient permissions to fulfill the request.

OAuth

403

2001

REQUEST

Too many requests

The request limit has been reached for the resource.

ACCESS

429

2002

REQUEST

Resource not resolved

A resource (URI) associated with the request could not be resolved.

ACCESS

404

2003

APPLICATION

Internal error

There was a problem with an eBay internal system or process. Contact eBay developer support for assistance.

ACCESS

500

2004

REQUEST

Invalid request

Request has errors. For help, see the documentation for this API.


ACCESS

400

3001

REQUEST

Request rejected

ROUTING

400

3002

REQUEST

Malformed request

The request has errors. For help, see the documentation for this API.

ROUTING

400

3003

REQUEST

Resource not found

A resource (URI) associated with the request could not be resolved.

ROUTING

404

3004

APPLICATION

Internal error

ROUTING

500

3005

APPLICATION

Internal error

ROUTING

502

Warnings

Warnings are grouped by the name of the module that caused them. Multiple warnings from the same module are separated by a newline. In the legacy error formatting mode (see below), which is the default, warnings are output in the following format:

"warnings" {
    "modulename" {
      "*" "warning text"
    }
  }

( will be replaced by when is used.)

When a non-legacy error formatting option is used, warnings are output in the same format as errors. E.g. with the format will be:

"warnings" 
    {
        "code" "warning message key",
        "*" "text of warning",
        "module" "API module which caused the warning"
    }

( will be replaced with when is used.)

Warning messages

Type Description Warning message(s)
Disabled submodule The submodule has been in the wiki. To check if a module is available before invoking it, see in the FAQ. The submodulename module has been disabled.
Missing submodule The , or submodule is not present in the wiki, for example if it is implemented by an extension that isn’t loaded. Unrecognized value for parameter list=submodule.
Parameter validation Warnings thrown when validating parameters of any API module. paramname is replaced by the name of the parameter.
  • Too many values supplied for parameter paramname: the limit is limit.
  • Unrecognized value for parameter paramname: value.
  • Unrecognized values for parameter paramname: value1, value2, value3

Таблица ошибок

Код Причина Описание Рекомендуемые действия
400 Параметр запроса имеет неверное значение. В полях и ответа приводятся сведения о недопустимом значении. Прежде чем повторить попытку, устраните проблему. Указанному в ответе параметру должно быть присвоено допустимое значение.
400 Неверный запрос. Возможно, отсутствует идентификатор родительского элемента, или запрошена недопустимая комбинация параметров и показателей. Прежде чем повторить попытку, устраните проблему. Внесите необходимые изменения в запрос к API.
401 Неверный или устаревший токен аутентификации. Прежде чем повторить попытку, устраните проблему. Получите новый токен аутентификации.
403 У пользователя нет разрешения на работу с объектом, указанным в запросе. Прежде чем повторить попытку, устраните проблему. Получите необходимые разрешения для работы с указанным объектом.
403 Пользователь превысил дневную квоту для проекта или профиля. Прежде чем повторить попытку, устраните проблему (исчерпана дневная квота). Подробнее об ограничениях и квотах в API…
403 Превышена квота запросов в течение 100 секунд на одного пользователя. Квота по умолчанию – 100 запросов за 100 секунд. Ее можно увеличить до 1000 запросов в Google API Console. Попробуйте применить алгоритм , чтобы снизить скорость отправки запросов.
403 Превышена . Попробуйте применить алгоритм , чтобы снизить скорость отправки запросов.
403 Достигнуто ограничение в 10 параллельных запросов к Core Reporting API на один профиль. Попробуйте применить алгоритм , предварительно дождавшись, пока будет завершен хотя бы один выполняемый запрос.
500 Непредвиденная ошибка сервера. Не выполняйте этот запрос повторно.
503 Ошибка сервера. Не выполняйте этот запрос повторно.

API error and warning responses

There are three different types of response components that you can receive after you send a request. Depending on what happens during the request processing, you can receive either errors or warnings, as follows:

  • There is a component and no component. This happens when no error occurred during processing, but one or more warnings occurred.
  • There is an component and no component. This happens when one or more errors occurred during processing. While warnings may also have occurred during processing, they are not included in any response with an error component.
  • There is neither an or component. This happens when no warnings and no errors occurred during processing.

Returned error and warning objects are the same type () and have the same fields.

Note that some fields take custom types, as defined here:

  • : Takes one of three values (, , or ) to indicate the type of problem encountered.
  • : Has two required fields, both strings, named and .

The following sections show typical responses for each of the three possibilities. The table in the section below lists all fields that could be included in a response when either errors or warnings occurred during request processing.

A warning response

The following example shows a response component with no component:

 {
    "warnings": ,
        "outputRefIds": ,
        "parameters": 
      }
    ],
    "resource": "Hello, eBay followers!"
  }

Note that because warnings do not stop processing, the HTTP status code returns as .

An error response

Here is an response component with no component:

  {
    "errors": ,
        "outputRefIds": ,
        "parameters": 
      }
    ]
  }

A response without errors or warnings

And finally, here’s a response without either an or component:

  HTTP/1.1 200 OK

  {
    "resource": "Hello, eBay follower!!"
  }

Error and warning response field values

The following table describes the fields that can be returned in an or container:

API error and warning fields

Field

Type

Description

errorData

object


The or object type.

errorData.category

ErrorCategory

The category type for this error or warning. It takes an object which can have one of three values:

  • : Indicates an exception or error occurred in the application code or at runtime. Examples include catching an exception in a service’s business logic, system failures, or request errors from a dependency.
  • : Used when your service or a dependent service refused to continue processing on the resource because of a business rule violation such as «Seller does not ship item to Antarctica» or «Buyer ineligible to purchase an alcoholic item». Business errors are not syntactical input errors.
  • : Used when there is anything wrong with the request, such as; authentication, syntactical errors, rate limiting or missing headers, bad HTTP header values, and so on.

errorData.domain

string

Name of the domain containing the service or application.

errorData.errorId

number(long)

A positive integer that uniquely identifies the specific error condition that occurred. Your application can use error codes as identifiers in your customized error-handling algorithms.

errorData.inputRefIds

string

Identifies specific request elements associated with the error, if any. ‘s response is format specific. For JSON, use JSONPath notation.

errorData.longMessage

string

An expanded version of that should be around 100-200 characters long, but is not required to be such.

errorData.message

string

An end user and app developer friendly device agnostic message. It explains what the error or warning is, and how to fix it (in a general sense). Its value is at most 50 characters long. If applicable, the value is localized in the end user’s requested locale.

errorData.outputRefIds

string

Identifies specific response elements associated with the error, if any. Path format is the same as .

errorData.parameters

ErrorParameter

This optional complex field type contains a list of one or more context-specific objects, with each item in the list entry being a parameter (or input field name) that caused an error condition. Each objects consist of two fields, a and a .

errorData.parameters.name

string

This is the name of the parameter/field for which the error was thrown.

errorData.parameters.value

string

This is the value of the parameter/field for which the error was thrown.

errorData.subDomain

string

Name of the domain’s subsystem or subdivision. For example, is a subdomain in the domain.

An example error response

The following error shows a sample response if there is a problem with one of the parameters passed into the call:

 {
  "errors": .itemId"
      ],
      "parameters": 
    }
  ]
}

server.of(nsp)

  • (String|RegExp|Function)
  • Returns

Initializes and retrieves the given by its pathname identifier . If the namespace was already initialized it returns it immediately.

const adminNamespace = io.of('/admin');

A regex or a function can also be provided, in order to create namespace in a dynamic way:

const dynamicNsp = io.of(/^\/dynamic-\d+$/).on('connect', (socket) => {  const newNamespace = socket.nsp;   newNamespace.emit('hello');});const socket = io('/dynamic-101');dynamicNsp.emit('hello');dynamicNsp.use((socket, next) => {  });

With a function:

io.of((name, query, next) => {  next(null, checkToken(query.token));}).on('connect', (socket) => {  });

Добавляйте отчеты об ошибках в свой интерфейс

Полезно иметь отчеты об ошибках и событиях фронтенда, чтобы вы знали, что происходит в разработке, прежде чем ваши пользователи сообщат вам о них. На моей основной работе мы используем браузер New Relic для отправки событий ошибок с фронтенда. Поэтому всякий раз, когда мы ловим исключение, мы регистрируем сообщение об ошибке вместе с трассировкой стека (хотя это иногда бесполезно с минимизированными пакетами) и некоторыми метаданными о текущем сеансе, чтобы попытаться воссоздать его.

Другие инструменты, используемые нами— Sentry + SDK браузер, Rollbar и целая куча других полезных инструментов, перечисленных на GitHub.

Заключение

Если вы больше ничего не можете выжать из этого, сделайте одно: перейдите в свою кодовую базу и просмотрите, как вы обрабатываете ошибки с помощью axios.

  • Проверьте, выполняете ли вы автоматические повторы, и, если нет, добавьте .
  • Проверьте, что вы отлавливаете ошибки и сообщаете пользователю, что что-то произошло. Использовать только недостаточно.
  • React TypeScript: Основы и лучшие практики
  • Первые шаги в анимации React Native
  • Как предотвратить состояние гонки с помощью React Context API

Читайте нас в телеграмме, vk и


С этим читают