Skip to content

API: Ошибки

Документация классов ошибок Kodzero SDK.

KodzeroApiError

Ошибка, возникающая при неуспешных ответах API (4xx, 5xx).

Свойства

СвойствоТипОписание
name'KodzeroApiError'Имя класса ошибки
messagestringСообщение об ошибке
urlstringURL запроса
statusCodenumberHTTP код ответа
detailsstringДополнительные детали ошибки

Определение класса

typescript
class KodzeroApiError extends Error {
  name: 'KodzeroApiError'
  url: string
  statusCode: number
  details: string

  constructor(
    url: string,
    statusCode: number,
    message: string,
    details?: string
  )
}

Пример обработки

typescript
try {
  const user = await User.get('non_existent_id')
} catch (error) {
  if (error.name === 'KodzeroApiError') {
    console.error('URL:', error.url)
    console.error('Код:', error.statusCode)
    console.error('Сообщение:', error.message)
    console.error('Детали:', error.details)
  }
}

Типичные HTTP коды

КодОписание
400Неверный запрос
401Не авторизован
403Доступ запрещён
404Не найдено
409Конфликт (например, дублирующийся email)
422Ошибка валидации
429Слишком много запросов
500Ошибка сервера
503Сервис недоступен

KodzeroValidationError

Ошибка валидации данных.

Свойства

СвойствоТипОписание
name'KodzeroValidationError'Имя класса ошибки
messagestringСообщение об ошибке
errorsstring[]Массив ошибок валидации

Определение класса

typescript
class KodzeroValidationError extends Error {
  name: 'KodzeroValidationError'
  errors: string[]

  constructor(message: string, errors?: string[])
}

Пример

typescript
const user = new User({
  _id: null,
  name: '',
  email: ''
})

const validation = user.validate()

if (!validation.ok) {
  throw new KodzeroValidationError(
    'Ошибка валидации данных',
    validation.errors
  )
}

Обработка

typescript
try {
  // ...
} catch (error) {
  if (error.name === 'KodzeroValidationError') {
    console.error('Ошибки:', error.errors)
    // ['name is required', 'email is required']
  }
}

Проверка типа ошибки

По имени

typescript
try {
  await someOperation()
} catch (error) {
  switch (error.name) {
    case 'KodzeroApiError':
      handleApiError(error)
      break
    case 'KodzeroValidationError':
      handleValidationError(error)
      break
    default:
      handleUnknownError(error)
  }
}

Утилитарные функции

typescript
function isKodzeroApiError(error: unknown): error is KodzeroApiError {
  return error instanceof Error && error.name === 'KodzeroApiError'
}

function isKodzeroValidationError(error: unknown): error is KodzeroValidationError {
  return error instanceof Error && error.name === 'KodzeroValidationError'
}

// Использование
try {
  await someOperation()
} catch (error) {
  if (isKodzeroApiError(error)) {
    console.log('API ошибка:', error.statusCode)
  } else if (isKodzeroValidationError(error)) {
    console.log('Ошибки валидации:', error.errors)
  }
}

Примеры обработки

Универсальный обработчик

typescript
function handleError(error: unknown): {
  type: 'api' | 'validation' | 'unknown'
  message: string
  statusCode?: number
  errors?: string[]
} {
  if (error instanceof Error) {
    if (error.name === 'KodzeroApiError') {
      const apiError = error as any
      return {
        type: 'api',
        message: apiError.message,
        statusCode: apiError.statusCode
      }
    }
    
    if (error.name === 'KodzeroValidationError') {
      const validationError = error as any
      return {
        type: 'validation',
        message: validationError.message,
        errors: validationError.errors
      }
    }
    
    return {
      type: 'unknown',
      message: error.message
    }
  }
  
  return {
    type: 'unknown',
    message: String(error)
  }
}

React компонент для отображения ошибок

tsx
interface ErrorDisplayProps {
  error: Error | null
}

function ErrorDisplay({ error }: ErrorDisplayProps) {
  if (!error) return null

  if (error.name === 'KodzeroApiError') {
    const apiError = error as any
    return (
      <div className="error api-error">
        <h4>Ошибка API ({apiError.statusCode})</h4>
        <p>{apiError.message}</p>
        {apiError.details && <small>{apiError.details}</small>}
      </div>
    )
  }

  if (error.name === 'KodzeroValidationError') {
    const validationError = error as any
    return (
      <div className="error validation-error">
        <h4>Ошибки валидации</h4>
        <ul>
          {validationError.errors.map((err: string, i: number) => (
            <li key={i}>{err}</li>
          ))}
        </ul>
      </div>
    )
  }

  return (
    <div className="error unknown-error">
      <p>{error.message}</p>
    </div>
  )
}

Обработка по HTTP коду

typescript
async function fetchWithErrorHandling<T>(
  operation: () => Promise<T>
): Promise<T> {
  try {
    return await operation()
  } catch (error) {
    if (error.name === 'KodzeroApiError') {
      const { statusCode, message } = error as any
      
      switch (statusCode) {
        case 401:
          // Перенаправить на логин
          window.location.href = '/login'
          break
        case 403:
          alert('У вас нет доступа к этому ресурсу')
          break
        case 404:
          alert('Запрашиваемый ресурс не найден')
          break
        case 429:
          // Подождать и повторить
          await new Promise(r => setTimeout(r, 5000))
          return fetchWithErrorHandling(operation)
        default:
          alert(`Ошибка: ${message}`)
      }
    }
    throw error
  }
}

Опубликовано под лицензией ISC.