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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 129
  • Облачные технологии14 088
  • QA вакансии3 457
  • Backend вакансии2 115
  • Инженер данных1 805
  • Продакт-менеджер1 262

Разработка

  • Android1 865
  • iOS1 698
  • Fullstack вакансии989
  • AI вакансии949
  • Frontend вакансии744
  • Mobile вакансии44

По стеку

  • Go8 660
  • Java6 550
  • Node.js2 020
  • .NET1 722
  • Kotlin1 619
  • Rust1 455
  • C#711
  • PHP683
  • C++572

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

  • Kubernetes7 769
  • DevOps вакансии6 056
  • Linux-инфраструктура5 493
  • Terraform / IaC4 266
  • CI/CD3 250
  • Мониторинг и Observability1 788
  • SRE567
  • Кибербезопасность453

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

  • Data Scientist1 141
  • Бизнес-аналитик927
  • Аналитик данных854
  • Системный аналитик153

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

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

По регионам

  • Вакансии в США44 281
  • Вакансии в Европе23 875
  • Вакансии в Канаде4 475
  • Работа в России3 922

По формату

  • Удалённые вакансии75 035
  • Релокация в США44 281
  • Гибридная работа12 401
  • Офисная работа7 079

По уровню

  • Senior вакансии42 679
  • Middle вакансии20 894
  • Junior вакансии6 722

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis39 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

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

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

Как организовать error handling в приложении через thiserror, anyhow и custom error types?

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

thiserror автоматически генерирует Display и From для типизированных enum-ошибок библиотек. anyhow даёт ergonomic Box<dyn Error> для приложений с контекстом через .context(). Комбинация: библиотеки используют thiserror, бинарники — anyhow.

Кастомные типы без зависимостей

Базовый подход — enum с вариантами ошибок, реализующий std::error::Error, Display и From для конвертации.

use std::fmt;
use std::num::ParseIntError;
use std::io;

#[derive(Debug)]
pub enum ConfigError {
    Io(io::Error),
    Parse(ParseIntError),
    MissingKey(String),
}

impl fmt::Display for ConfigError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            ConfigError::Io(e) => write!(f, "IO error: {}", e),
            ConfigError::Parse(e) => write!(f, "parse error: {}", e),
            ConfigError::MissingKey(k) => write!(f, "missing key: {}", k),
        }
    }
}

impl std::error::Error for ConfigError {
    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
        match self {
            ConfigError::Io(e) => Some(e),
            ConfigError::Parse(e) => Some(e),
            ConfigError::MissingKey(_) => None,
        }
    }
}

impl From<io::Error> for ConfigError {
    fn from(e: io::Error) -> Self { ConfigError::Io(e) }
}
impl From<ParseIntError> for ConfigError {
    fn from(e: ParseIntError) -> Self { ConfigError::Parse(e) }
}

Error handling в Rust: thiserror, anyhow и кастомные типы

thiserror: для библиотечных ошибок

Крейт thiserror генерирует весь boilerplate через derive-макросы. Версия 1.x стабильна, 2.x — с улучшенной диагностикой.

// Cargo.toml: thiserror = "2"
use thiserror::Error;

#[derive(Debug, Error)]
pub enum AppError {
    #[error("database error: {0}")]
    Database(#[from] sqlx::Error),

    #[error("not found: {id}")]
    NotFound { id: u64 },

    #[error("validation failed: {field} — {message}")]
    Validation { field: String, message: String },

    #[error("IO error")]
    Io(#[from] std::io::Error),
}

async fn get_user(id: u64, pool: &sqlx::PgPool) -> Result<User, AppError> {
    let user = sqlx::query_as!(User, "SELECT * FROM users WHERE id = $1", id as i64)
        .fetch_optional(pool)
        .await?;  // sqlx::Error -> AppError::Database через From

    user.ok_or(AppError::NotFound { id })
}

anyhow: для приложений и бинарников

anyhow::Error — динамический тип ошибки с backtrace и контекстом. Идеален для main(), CLI и мест, где тип ошибки не важен вызывающему коду.

// Cargo.toml: anyhow = "1"
use anyhow::{Context, Result, bail, ensure};

fn load_config(path: &str) -> Result<Config> {
    let content = std::fs::read_to_string(path)
        .with_context(|| format!("failed to read config from '{}'", path))?;

    let config: Config = serde_json::from_str(&content)
        .context("invalid JSON in config file")?;

    ensure!(config.port > 1024, "port must be > 1024, got {}", config.port);

    Ok(config)
}

fn main() -> Result<()> {
    let config = load_config("config.json")?;
    println!("Listening on port {}", config.port);
    Ok(())
}

// bail! — ранний возврат с ошибкой
fn check_age(age: u32) -> Result<()> {
    if age < 18 {
        bail!("age must be >= 18, got {}", age);
    }
    Ok(())
}

Стратегия: библиотека + приложение

// В lib.rs: thiserror для типизированных ошибок
#[derive(Debug, thiserror::Error)]
pub enum LibError {
    #[error("resource not found: {0}")]
    NotFound(String),
}

// В main.rs / handlers: anyhow для оркестрации
use anyhow::Result;

fn run() -> Result<()> {
    let result = my_lib::do_something()
        .context("failed during startup")?;  // LibError -> anyhow::Error
    Ok(())
}

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

  • Смешивание anyhow::Error в публичном API библиотеки скрывает типы ошибок от пользователей — они не смогут сматчить варианты.
  • #[from] в thiserror создаёт From-имплементацию; два варианта с одним и тем же #[from]-типом вызовут конфликт.
  • Backtrace в anyhow требует RUST_BACKTRACE=1 или RUST_LIB_BACKTRACE=1 — без них трассировки нет даже в debug-сборке.
  • Не применяйте .unwrap() в production-библиотечном коде — паника пересекает crate-границу без контекста.
  • anyhow::Error не реализует std::error::Error напрямую — нельзя передать в API, ожидающий Box<dyn Error>, без .into().
  • Цепочка source() обрывается, если промежуточный тип не реализует Error::source() — проверяйте полноту цепочки при отладке.

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

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

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

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

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

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

Источники

  • https://doc.rust-lang.org/book/
  • https://doc.rust-lang.org/cargo/reference/
←Предыдущий вопросЧто такое Cargo features и как они влияют на dependency graph и binary size?Следующий вопрос→Как Rust обрабатывает паники и в чём разница между `panic!` и возвратом `Result`?

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

Rustrisk-analysisrust-productiontechnical-depth

Вакансии с этим навыком

Rust вакансии
  • Software Engineer, Full Stack (Data & Video Analysis)
  • Sr. Software Engineer, Full Stack (Data & Video Analysis)
  • Manager, Software Engineering
  • Senior Flutter Developer (AI)
  • Senior Data Engineer (ETL / GCP)

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

  • Для каких задач Rust является сильным выбором, а где лучше честно выбрать другой язык?
  • Какие production-риски чаще всего возникают в проектах на Rust: производительность, зависимости, конкурентность, деплой или observability?
  • Как сравнить Rust с ближайшими альтернативами по производительности, поддерживаемости, найму и экосистеме?
  • Какие особенности runtime, type system или memory model Rust реально влияют на архитектуру приложения?