Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 718новых вакансий за сутки·92 064вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 263
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 401 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python16 419
  • Облачные технологии13 177
  • QA вакансии3 434
  • Backend вакансии2 038
  • Инженер данных1 685
  • Продакт-менеджер1 179

Разработка

  • Android1 816
  • iOS1 666
  • AI вакансии939
  • Fullstack вакансии894
  • Frontend вакансии718
  • Mobile вакансии38

По стеку

  • Go8 563
  • Java6 092
  • Node.js1 890
  • Kotlin1 554
  • .NET1 545
  • Rust1 433
  • PHP641
  • C#563
  • C++498

DevOps и инфраструктура

  • Kubernetes7 304
  • DevOps вакансии5 596
  • Linux-инфраструктура5 290
  • Terraform / IaC4 016
  • CI/CD2 559
  • Мониторинг и Observability1 734
  • SRE550
  • Кибербезопасность413

Аналитика и данные

  • Data Scientist1 054
  • Бизнес-аналитик868
  • Аналитик данных834
  • Системный аналитик134

Другие направления

  • Проджект-менеджер534
  • UI/UX дизайн130
  • Ручное тестирование14

По регионам

  • Вакансии в США45 164
  • Вакансии в Европе22 405
  • Вакансии в Канаде4 469
  • Работа в России3 876

По формату

  • Удалённые вакансии74 516
  • Релокация в США45 163
  • Гибридная работа11 409
  • Офисная работа6 957

По уровню

  • Senior вакансии41 452
  • Middle вакансии20 529
  • Junior вакансии6 700

Сейчас нанимают

Все компании
  • Wise194 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab136 вакансий
  • Celonis45 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме ActixВсе вопросы
ActixMiddleТеория

Как стандартизировать error responses и map internal errors to HTTP?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Реализуем единый AppError enum с impl ResponseError — он конвертирует внутренние ошибки в HTTP-статусы и JSON-тело. Все хендлеры возвращают Result<_, AppError>.

Определение AppError

use actix_web::{HttpResponse, ResponseError};
use serde::Serialize;
use std::fmt;

#[derive(Debug)]
pub enum AppError {
    NotFound(String),
    Unauthorized(String),
    Forbidden(String),
    Validation(String),
    Database(sqlx::Error),
    Internal(String),
}

#[derive(Serialize)]
struct ErrorResponse {
    error: &'static str,
    message: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    details: Option<serde_json::Value>,
}

impl fmt::Display for AppError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            AppError::NotFound(msg) => write!(f, "Not found: {}", msg),
            AppError::Unauthorized(msg) => write!(f, "Unauthorized: {}", msg),
            AppError::Forbidden(msg) => write!(f, "Forbidden: {}", msg),
            AppError::Validation(msg) => write!(f, "Validation: {}", msg),
            AppError::Database(e) => write!(f, "Database error: {}", e),
            AppError::Internal(msg) => write!(f, "Internal: {}", msg),
        }
    }
}

impl ResponseError for AppError {
    fn error_response(&self) -> HttpResponse {
        let (status, error_code, message) = match self {
            AppError::NotFound(msg) => (
                actix_web::http::StatusCode::NOT_FOUND,
                "NOT_FOUND",
                msg.clone(),
            ),
            AppError::Unauthorized(msg) => (
                actix_web::http::StatusCode::UNAUTHORIZED,
                "UNAUTHORIZED",
                msg.clone(),
            ),
            AppError::Forbidden(msg) => (
                actix_web::http::StatusCode::FORBIDDEN,
                "FORBIDDEN",
                msg.clone(),
            ),
            AppError::Validation(msg) => (
                actix_web::http::StatusCode::UNPROCESSABLE_ENTITY,
                "VALIDATION_ERROR",
                msg.clone(),
            ),
            AppError::Database(e) => {
                tracing::error!("Database error: {:?}", e);
                (
                    actix_web::http::StatusCode::INTERNAL_SERVER_ERROR,
                    "DATABASE_ERROR",
                    "A database error occurred".to_string(),
                )
            }
            AppError::Internal(msg) => {
                tracing::error!("Internal error: {}", msg);
                (
                    actix_web::http::StatusCode::INTERNAL_SERVER_ERROR,
                    "INTERNAL_ERROR",
                    "An internal error occurred".to_string(),
                )
            }
        };

        HttpResponse::build(status).json(ErrorResponse {
            error: error_code,
            message,
            details: None,
        })
    }
}

Стандартизация error responses в Actix Web

Actix Web имеет трейт ResponseError, который позволяет превратить любой тип ошибки в HTTP-ответ. Цель — один enum для всех доменных ошибок с детерминированным маппингом в HTTP-статусы.

Конвертация из sqlx и других ошибок

impl From<sqlx::Error> for AppError {
    fn from(e: sqlx::Error) -> Self {
        match e {
            sqlx::Error::RowNotFound => AppError::NotFound("Record not found".to_string()),
            _ => AppError::Database(e),
        }
    }
}

Использование в хендлерах

async fn get_user(
    pool: web::Data<PgPool>,
    path: web::Path<Uuid>,
) -> Result<HttpResponse, AppError> {
    let user = sqlx::query_as!(User, "SELECT * FROM users WHERE id = $1", *path)
        .fetch_optional(pool.get_ref())
        .await?
        .ok_or_else(|| AppError::NotFound(format!("User {} not found", *path)))?;

    Ok(HttpResponse::Ok().json(user))
}

Оператор ? автоматически конвертирует sqlx::Error в AppError через From-реализацию.

Подводные камни

  • Не возвращайте детали внутренних ошибок клиенту — логируйте server-side, отправляйте generic message.
  • actix_web::Error (встроенный) и ваш AppError — разные типы; при оборачивании сторонних middleware ошибки могут обходить ваш ResponseError.
  • Валидация через web::Json<T> возвращает JsonPayloadError до вызова хендлера — нужен кастомный .app_data(web::JsonConfig::default().error_handler(...)).
  • При использовании ? в цепочке важно, чтобы все типы ошибок реализовывали From<X> for AppError, иначе компилятор откажет.
  • Одинаковые HTTP-статусы для разных ошибок (оба 500) затрудняют мониторинг — используйте error_code поле в JSON для различения.
  • Паника в хендлере не проходит через ResponseError — добавьте .wrap(middleware::Logger::default()) для логирования 500 от паник.

Частые вопросы на собеседовании

  • В каких backend-проектах Actix (Rust) является сильным выбором, а где лучше выбрать более простой или другой стек?
  • Представьте, endpoint на Actix (Rust) иногда отвечает за секунды вместо миллисекунд. Как вы будете искать причину?
  • Проект на Actix (Rust) вырос из MVP в большой production-сервис. Какие проблемы архитектуры и сопровождения вы ожидаете увидеть?
  • Как реализовать graceful shutdown в Actix-web?

Типичные ошибки

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

Что проверяет интервьюер

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

Как вы знаете этот вопрос?

Проверить себя по теме Actix →

Источники

  • https://actix.rs/docs/

Связанные темы

Actixactix-productionActix (Rust)risk-analysistechnical-depth