В этом руководстве объясняется, как API Google Ads обрабатывает ошибки и сообщает о них. Понимание структуры и смысла ошибок API критически важно для создания надежных приложений, способных корректно решать проблемы — от недопустимых входных данных до временной недоступности сервиса.
 API Google Ads следует стандартной модели ошибок API Google, основанной на кодах статуса gRPC . Каждый ответ API, приводящий к ошибке, включает объект Status содержащий:
- Числовой код ошибки.
- Сообщение об ошибке.
- Необязательные дополнительные сведения об ошибке.
Канонические коды ошибок
API Google Ads использует набор канонических кодов ошибок, определяемых gRPC и HTTP. Эти коды предоставляют общую информацию о типе ошибки. Всегда следует сначала проверять этот числовой код, чтобы понять суть проблемы.
В следующей таблице приведены наиболее распространенные коды, с которыми вы можете столкнуться при использовании API Google Ads:
| код gRPC | HTTP-код | Имя перечисления | Описание | Руководство | 
|---|---|---|---|---|
| 0 | 200 | OK | Ошибок нет; указывает на успех. | Н/Д | 
| 1 | 499 | CANCELLED | Операция была отменена, как правило, клиентом. | Обычно это означает, что клиент перестал ждать. Проверьте тайм-ауты на стороне клиента. | 
| 2 | 500 | UNKNOWN | Произошла неизвестная ошибка. Более подробная информация может быть в сообщении об ошибке или в описании. | Рассматривать как ошибку сервера. Часто можно повторить попытку с отсрочкой. | 
| 3 | 400 | INVALID_ARGUMENT | Клиент указал недопустимый аргумент. Это указывает на проблему, препятствующую обработке запроса API, например, на неверно сформированное имя ресурса или недопустимое значение. | Ошибка клиента: проверьте параметры запроса и убедитесь, что они соответствуют требованиям API. Информация об ошибке обычно содержит информацию о том, какой аргумент был недействителен и как именно — используйте эту информацию для исправления запроса. Не повторяйте попытку, пока не исправите запрос. | 
| 4 | 504 | DEADLINE_EXCEEDED | Срок истек до того, как операция была завершена. | Ошибка сервера: часто временная. Рассмотрите возможность повторной попытки с экспоненциальной задержкой . | 
| 5 | 404 | NOT_FOUND | Некоторые запрошенные объекты, например кампания или группа объявлений, не найдены. | Ошибка клиента: проверьте наличие и идентификатор ресурсов, к которым вы пытаетесь получить доступ. Не повторяйте попытку без исправления. | 
| 6 | 409 | ALREADY_EXISTS | Сущность, которую клиент пытался создать, уже существует. | Ошибка клиента: Избегайте создания дублирующихся ресурсов. Перед созданием ресурса проверьте его существование. | 
| 7 | 403 | PERMISSION_DENIED | У вызывающего абонента нет разрешения на выполнение указанной операции. | Ошибка клиента: проверьте аутентификацию , авторизацию и роли пользователей для аккаунта Google Ads. Не повторяйте попытку без разрешения прав доступа. | 
| 8 | 429 | RESOURCE_EXHAUSTED | Либо ресурс исчерпан (например, вы превысили квоту), либо система перегружена. | Ошибка клиент/сервер: обычно требует ожидания. Реализуйте экспоненциальную задержку и, возможно, уменьшите частоту запросов. См. раздел «Ограничения и квоты API» . | 
| 9 | 400 | FAILED_PRECONDITION | Операция отклонена, поскольку система не находится в состоянии, необходимом для её выполнения. Например, отсутствует обязательное поле. | Ошибка клиента: запрос действителен, но состояние неверно. Ознакомьтесь с описанием ошибки, чтобы понять причину сбоя. Не повторяйте попытку без исправления состояния. | 
| 10 | 409 | ABORTED | Операция была прервана, как правило, из-за проблемы параллелизма, например конфликта транзакций. | Ошибка сервера: зачастую можно безопасно повторить попытку с небольшой задержкой. | 
| 11 | 400 | OUT_OF_RANGE | Была предпринята попытка выполнить операцию за пределами допустимого диапазона. | Ошибка клиента: Исправьте диапазон или индекс. | 
| 12 | 501 | UNIMPLEMENTED | Операция не реализована или не поддерживается API. | Ошибка клиента: проверьте версию API и доступные функции. Не повторяйте попытку. | 
| 13 | 500 | INTERNAL | Произошла внутренняя ошибка. Это общее описание проблем на стороне сервера. | Ошибка сервера: обычно возможна повторная попытка с экспоненциальной задержкой . Если проблема повторяется, сообщите о ней . | 
| 14 | 503 | UNAVAILABLE | В настоящее время сервис недоступен. Скорее всего, это временная проблема. | Ошибка сервера: настоятельно рекомендуется повторить попытку с экспоненциальной задержкой . | 
| 15 | 500 | DATA_LOSS | Невосстановимая потеря или повреждение данных. | Ошибка сервера: редкое явление. Указывает на серьёзную проблему. Не повторяйте попытку. Если проблема повторяется, сообщите о ней . | 
| 16 | 401 | UNAUTHENTICATED | Запрос не имеет действительных учетных данных аутентификации. | Ошибка клиента: Проверьте токены аутентификации и учётные данные. Не повторяйте попытку, пока не исправите ошибки аутентификации. | 
Более подробную информацию об этих кодах можно найти в Руководстве по проектированию API - Коды ошибок .
Понять детали ошибки
 Помимо кода верхнего уровня, API Google Ads предоставляет более подробную информацию об ошибке в поле details объекта Status . Это поле часто содержит прототип GoogleAdsFailure , включающий список отдельных объектов GoogleAdsError .
 Каждый объект GoogleAdsFailure содержит:
-  errors: список объектовGoogleAdsError, каждый из которых описывает конкретную произошедшую ошибку.
-  request_id: уникальный идентификатор запроса, полезный для отладки и поддержки.
 Каждый объект GoogleAdsError предоставляет:
-  errorCode: более подробный код ошибки, специфичный для API Google Ads , напримерAuthenticationError.NOT_ADS_USER.
-  message: понятное для человека описание конкретной ошибки.
-  trigger: значение, вызвавшее ошибку, если применимо.
-  location: Описывает, где в запросе произошла ошибка, включая пути к полям.
-  details: Дополнительные сведения об ошибке, например, неопубликованные причины ошибки.
Пример сведений об ошибке
 При возникновении ошибки ваша клиентская библиотека предоставит вам доступ к этим данным. Например, INVALID_ARGUMENT (код 3) может содержать следующие данные GoogleAdsFailure :
{
  "code": 3,
  "message": "The request was invalid.",
  "details": [
    {
      "@type": "type.googleapis.com/google.ads.googleads.v17.errors.GoogleAdsFailure",
      "errors": [
        {
          "errorCode": {
            "fieldError": "REQUIRED"
          },
          "message": "The required field was not present.",
          "location": {
            "fieldPathElements": [
              { "fieldName": "operations" },
              { "fieldName": "create" },
              { "fieldName": "name" }
            ]
          }
        },
        {
          "errorCode": {
            "stringLengthError": "TOO_SHORT"
          },
          "message": "The provided string is too short.",
          "trigger": {
            "stringValue": ""
          },
          "location": {
            "fieldPathElements": [
              { "fieldName": "operations" },
              { "fieldName": "create" },
              { "fieldName": "description" }
            ]
          }
        }
      ]
    }
  ]
}
 В этом примере, несмотря на INVALID_ARGUMENT верхнего уровня, сведения GoogleAdsFailure сообщают, что поля name и description вызвали проблему, а также причину ( REQUIRED и TOO_SHORT соответственно).
Найдите сведения об ошибке
Способ доступа к сведениям об ошибках зависит от того, используете ли вы стандартные вызовы API, частичный сбой или потоковую передачу.
Стандартные и потоковые вызовы API
 При сбое API-вызова без использования частичного отказа, включая потоковые вызовы , объект GoogleAdsFailure возвращается в составе конечных метаданных в заголовках ответа gRPC. При использовании REST для стандартных вызовов GoogleAdsFailure возвращается в HTTP-ответе. Клиентские библиотеки обычно отображают это как исключение с атрибутом GoogleAdsFailure .
Частичный отказ
 При использовании частичного отказа ошибки невыполненных операций возвращаются в поле partial_failure_error ответа, а не в заголовках ответа. В этом случае GoogleAdsFailure встроен в объект google.rpc.Status в ответе.
Пакетные задания
 При пакетной обработке ошибки отдельных операций можно обнаружить, извлекая результаты пакетного задания после его завершения. Результат каждой операции будет включать поле status с подробностями об ошибке, если операция завершилась неудачно.
Запрос идентификатора
 request-id — это уникальная строка, которая идентифицирует ваш запрос API и необходима для устранения неполадок.
 request-id можно найти в нескольких местах:
-  GoogleAdsFailure: если вызов API завершается неудачей и возвращаетсяGoogleAdsFailure, он будет содержатьrequest_id.
-  Конечные метаданные : как для успешных, так и для неудачных запросов request-idдоступен в конечных метаданных ответа gRPC.
-  Заголовки ответов : как для успешных, так и для неудачных запросов request-idтакже доступен в заголовках ответов gRPC и HTTP, за исключением успешных потоковых запросов.
-  SearchGoogleAdsStreamResponse: для потоковых запросов каждое сообщениеSearchGoogleAdsStreamResponseсодержит полеrequest_id.
 При регистрации ошибок или обращении в службу поддержки обязательно указывайте request-id , чтобы облегчить диагностику проблем.
Лучшие практики обработки ошибок
Для создания отказоустойчивых приложений реализуйте следующие рекомендации:
- Проверьте сведения об ошибке: всегда анализируйте поле - detailsобъекта- Status, обращая особое внимание на- GoogleAdsFailure. Подробные- errorCode,- messageи- locationв- GoogleAdsErrorпредоставляют наиболее полезную информацию для отладки и обратной связи с пользователем.
- Различайте ошибки клиента и сервера: -  Ошибки клиента: коды типа INVALID_ARGUMENT,NOT_FOUND,PERMISSION_DENIED,FAILED_PRECONDITION,UNAUTHENTICATED. Они требуют изменения запроса или состояния/учётных данных вашего приложения. Не повторяйте запрос, не устранив проблему.
-  Ошибки сервера: коды типа UNAVAILABLE,INTERNAL,DEADLINE_EXCEEDED,UNKNOWN. Они указывают на временную проблему со службой API.
 
-  Ошибки клиента: коды типа 
- Реализуйте стратегию повторных попыток: -  Когда повторять попытку: Повторяйте попытку только в случае временных ошибок сервера, таких как UNAVAILABLE,DEADLINE_EXCEEDED,INTERNAL,UNKNOWNиABORTED.
- Экспоненциальная задержка: используйте алгоритм экспоненциальной задержки для увеличения интервалов ожидания между повторными попытками. Это помогает избежать перегрузки и без того нагруженного сервиса. Например, подождите 1 секунду, затем 2 секунды, затем 4 секунды, продолжая до достижения максимального количества повторных попыток или общего времени ожидания.
- Джиттер: добавьте небольшое случайное количество «джитер» к задержкам отсрочки, чтобы предотвратить проблему «громового стада», когда множество клиентов одновременно повторяют попытки.
 
-  Когда повторять попытку: Повторяйте попытку только в случае временных ошибок сервера, таких как 
- Тщательное протоколирование: регистрируйте полный ответ об ошибке, включая все детали, особенно идентификатор запроса. Эта информация важна для отладки и для сообщения о проблемах в службу поддержки Google при необходимости. 
- Предоставляйте обратную связь: предоставляйте пользователям вашего приложения понятную и полезную обратную связь на основе конкретных кодов и сообщений - GoogleAdsError. Например, вместо просто «Произошла ошибка» можно указать «Требуется название кампании» или «Указанный идентификатор группы объявлений не найден».
Следуя этим рекомендациям, вы сможете эффективно диагностировать и обрабатывать ошибки, возвращаемые API Google Ads, что приведет к созданию более стабильных и удобных для пользователя приложений.