Обзор
SDK выбрасывает ошибки через два связанных класса:
SdkError— выбрасывается самим кодом SDK (валидация, конфигурация, устаревшие пути, внутренние инварианты). Всегда несётcode,status(HTTP-подобный) и необязательныйoriginalError.AjaxError extends SdkError— выбрасывается, когда HTTP-вызов к Bitrix24 завершается неудачей. ДобавляетrequestInfo(method,requestId, параметры запроса), чтобы вы могли сопоставлять с логами на стороне портала. Начиная с v1.1.2 (#39),requestInfoне включает полный URL запроса, а поля с учётными данными внутриparamsредактируются — цель в том, чтобы секреты вебхуков не попадали в выводtoJSON()/toString().
Методы, которые не выбрасывают исключения — Call, CallList, Batch, BatchByChunk — сообщают о сбоях через Result/AjaxResult: проверяйте .isSuccess и читайте .getErrorMessages(). FetchList, напротив, выбрасывает исключение при сбое (генератор не может завершиться частично).
import { SdkError, AjaxError } from '@bitrix24/b24jssdk'
try {
// …вызовы SDK
}
catch (error) {
if (error instanceof AjaxError) {
// сетевой / портальный сбой; error.code — это код Bitrix24
console.error(error.code, error.status, error.requestInfo?.method, error.requestInfo?.requestId)
}
else if (error instanceof SdkError) {
// проблема на стороне SDK; error.code начинается с JSSDK_
console.error(error.code, error.status)
}
else {
throw error
}
}
Коды SdkError, выбрасываемые SDK
Коды — стабильные строки; сопоставляйте по ним, не парсите сообщения.
Коды со стороны REST, возвращаемые как AjaxError
Bitrix24 возвращает их в поле error HTTP-ответа. SDK переносит их в AjaxError.code как есть — сопоставляйте по строке.
Это не исчерпывающий список — полный список по методам Bitrix24 публикует на apidocs.bitrix24.ru. Всё, что здесь не перечислено, проходит как есть в AjaxError.code.
Паттерны обработки
Отличить баги SDK от сбоев на стороне портала
AjaxError наследует SdkError, поэтому располагайте проверки instanceof от частного к общему:
// @check-ignore: top-level try/catch with return, not valid at module scope
import { AjaxError, SdkError } from '@bitrix24/b24jssdk'
try {
await $b24.actions.v2.call.make({ method: 'crm.deal.get', params: { id: 1 } })
}
catch (error) {
if (error instanceof AjaxError) {
// Сторона портала: error.code — это код Bitrix24 (например, expired_token)
if (error.code === 'expired_token') return refreshAndRetry()
if (error.code === 'AUTHORIZE_ERROR') return showPermissionDenied()
throw error
}
if (error instanceof SdkError) {
// Сторона SDK: error.code начинается с JSSDK_
throw error // это ошибки программиста, показывайте их
}
throw error
}
// @check-ignore: top-level try/catch with return, not valid at module scope
import { AjaxError, SdkError } from '@bitrix24/b24jssdk'
try {
await $b24.actions.v3.call.make({ method: 'crm.deal.get', params: { id: 1 } })
}
catch (error) {
if (error instanceof AjaxError) {
// Сторона портала: error.code — это код Bitrix24 (например, expired_token)
if (error.code === 'expired_token') return refreshAndRetry()
if (error.code === 'AUTHORIZE_ERROR') return showPermissionDenied()
throw error
}
if (error instanceof SdkError) {
// Сторона SDK: error.code начинается с JSSDK_
throw error // это ошибки программиста, показывайте их
}
throw error
}
Используйте isSuccess для невыбрасывающих методов
Call, CallList, Batch, BatchByChunk возвращают Result / AjaxResult вместо выброса исключения:
// @check-ignore: top-level return in callList error-handling illustration
const response = await $b24.actions.v2.callList.make({ /* … */ })
if (!response.isSuccess) {
console.error(response.getErrorMessages().join('; '))
return
}
const items = response.getData()
// @check-ignore: top-level return in callList error-handling illustration
const response = await $b24.actions.v3.callList.make({ /* … */ })
if (!response.isSuccess) {
console.error(response.getErrorMessages().join('; '))
return
}
const items = response.getData()
Для батчей с isHaltOnError: false isSuccess становится false при любом сбое вложенного вызова, но getData() всё равно содержит успешные записи. Итерируйте и проверяйте .isSuccess по каждой строке, если нужно знать, какие вызовы прошли.
Оборачивайте for await в try/catch для FetchList
// @check-ignore: top-level for-await in fetchList error-handling illustration
try {
for await (const chunk of $b24.actions.v2.fetchList.make({ /* … */ })) {
await persist(chunk)
}
}
catch (error) {
if (
error instanceof SdkError
&& error.code === 'JSSDK_CORE_B24_FETCH_LIST_METHOD_API_V2'
) {
// запрос страницы завершился неудачей; сохранённые до этого момента чанки всё ещё валидны
return resumeFromLastSavedId()
}
throw error
}
// @check-ignore: top-level for-await in fetchList error-handling illustration
try {
for await (const chunk of $b24.actions.v3.fetchList.make({ /* … */ })) {
await persist(chunk)
}
}
catch (error) {
if (
error instanceof SdkError
&& error.code === 'JSSDK_CORE_B24_FETCH_LIST_METHOD_API_V3'
) {
// запрос страницы завершился неудачей; сохранённые до этого момента чанки всё ещё валидны
return resumeFromLastSavedId()
}
throw error
}
Решите, что повторять
См. также
- Выбор метода — подбирает правильный примитив до того, как вам придётся читать эту страницу.
- Система ограничений — конфигурация rate limit, времени операций и адаптивной задержки.
AjaxResult— полная поверхность payload (isSuccess,getData,getErrorMessages). Пейджинговые хелперы только для v2 —isMore,hasMore,getNext,fetchNextиgetTotal— устарели и намечены к удалению в 2.0.0; используйте вместо нихb24.actions.v{2,3}.callList.makeилиfetchList.make.getNext()продолжает выбрасыватьJSSDK_CORE_METHOD_NOT_SUPPORT_IN_API_V3на клиентах v3.
Фильтрация
Справочник по построению параметров фильтра в Bitrix24 REST API v2 (префиксные операторы) и v3 (массив троек), включая формат дат и правило отбрасывания order.
Обнаружение v3-методов
Используйте rest.documentation.openapi, чтобы получить собственный машиночитаемый список всех доступных методов REST API v3 портала — источник истины, на который SDK опирается вместо захардкоженного allowlist. Особенно полезно для AI-агентов и кодогенерации.