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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 196
  • Облачные технологии14 160
  • QA вакансии3 451
  • Backend вакансии2 107
  • Инженер данных1 800
  • Продакт-менеджер1 247

Разработка

  • Android1 855
  • iOS1 695
  • Fullstack вакансии995
  • AI вакансии952
  • Frontend вакансии751
  • Mobile вакансии43

По стеку

  • Go8 754
  • Java6 595
  • Node.js2 038
  • .NET1 738
  • Kotlin1 617
  • Rust1 473
  • C#718
  • PHP692
  • C++582

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

  • Kubernetes7 778
  • DevOps вакансии6 088
  • Linux-инфраструктура5 502
  • Terraform / IaC4 276
  • CI/CD3 275
  • Мониторинг и Observability1 793
  • SRE563
  • Кибербезопасность453

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

  • Data Scientist1 141
  • Бизнес-аналитик921
  • Аналитик данных860
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США44 164
  • Вакансии в Европе24 016
  • Вакансии в Канаде4 533
  • Работа в России3 837

По формату

  • Удалённые вакансии75 134
  • Релокация в США44 163
  • Гибридная работа12 456
  • Офисная работа7 066

По уровню

  • Senior вакансии42 633
  • Middle вакансии20 971
  • Junior вакансии6 706

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

Все компании
  • Rakuten189 вакансий
  • Wise189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

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

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

Как работает обработка ошибок в Elixir (tagged tuples, with, try/rescue)?

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

Elixir использует tagged tuples ({:ok, value}/{:error, reason}) для ожидаемых ошибок, with для цепочек операций с единым else-обработчиком, и try/rescue только для исключений от внешних библиотек — неожиданные ошибки пусть роняют процесс, Supervisor перезапустит.

Tagged tuples — основной паттерн

Большинство функций возвращают {:ok, value} или {:error, reason}. Это явный, типобезопасный контракт без исключений:

defmodule UserService do
  def find_user(id) when is_integer(id) do
    case Repo.get(User, id) do
      nil  -> {:error, :not_found}
      user -> {:ok, user}
    end
  end
  def find_user(_), do: {:error, :invalid_id}

  def update_email(user, email) do
    user
    |> User.changeset(%{email: email})
    |> Repo.update()
    # Ecto.Repo.update/1 сам возвращает {:ok, user} | {:error, changeset}
  end
end

Стратегии обработки ошибок в Elixir

Elixir различает два типа ошибочных ситуаций: ожидаемые (invalid input, not found, unauthorized) и неожиданные (баги, недоступная БД). Для каждого — свой инструмент.

with — цепочка операций с единой точкой сбора ошибок

with позволяет выстроить последовательность шагов, где каждый зависит от успеха предыдущего. Первый несовпавший паттерн уходит в else:

defmodule OrderProcessor do
  def process(order_params, user_id) do
    with {:ok, user}     <- UserService.find_user(user_id),
         :ok             <- check_subscription(user),
         {:ok, order}    <- create_order(order_params, user),
         {:ok, _payment} <- charge(user, order.total) do
      {:ok, order}
    else
      {:error, :not_found}      -> {:error, :user_not_found}
      {:error, :no_subscription} -> {:error, :upgrade_required}
      {:error, %Ecto.Changeset{} = cs} -> {:error, {:validation, cs}}
      {:error, :payment_declined} -> {:error, :payment_failed}
    end
  end

  defp check_subscription(%User{plan: :pro}), do: :ok
  defp check_subscription(_), do: {:error, :no_subscription}
end

try/rescue — для исключений и внешних библиотек

try/rescue используется для перехвата исключений (RuntimeError, ArgumentError и т.д.) — обычно от сторонних библиотек или при работе с внешними системами:

defmodule JsonParser do
  def parse(raw) do
    {:ok, Jason.decode!(raw)}
  rescue
    Jason.DecodeError -> {:error, :invalid_json}
    exception         -> {:error, {:unexpected, Exception.message(exception)}}
  end
end

# Пример с after для cleanup
def read_file(path) do
  file = File.open!(path)
  try do
    {:ok, IO.read(file, :all)}
  rescue
    e -> {:error, Exception.message(e)}
  after
    File.close(file)  # выполняется всегда
  end
end

raise и throw

# raise — для программных ошибок (баги, нарушения инвариантов)
defmodule Config do
  def get!(key) do
    case System.get_env(key) do
      nil   -> raise "Required env var #{key} is not set"
      value -> value
    end
  end
end

# throw/catch — для нелокальных выходов из глубокой рекурсии (редко)
def find_in_tree(tree, target) do
  try do
    traverse(tree, target)
    :not_found
  catch
    {:found, value} -> {:ok, value}
  end
end

Supervisor как последний рубеж

Философия Erlang/Elixir — «let it crash»: неожиданные ошибки пусть упадут процесс, Supervisor перезапустит его в чистом состоянии. try/rescue нужен только когда падение процесса неприемлемо (HTTP request handler, критичные cleanup-операции).

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

  • Избыточный rescue. Оборачивать весь код в try/rescue — антипаттерн. Это маскирует баги вместо того чтобы дать им упасть и быть зафиксированными.
  • with без else пробрасывает несовпавшие паттерны. Если шаг вернул nil вместо {:ok, _}, with без else вернёт nil — это трудно отследить.
  • Смешение tagged tuples и исключений. Если часть функций возвращает {:error, _}, а часть бросает исключения — API непредсказуем. Выбирайте одну стратегию в модуле.
  • Атом причины ошибки — не всегда достаточно. {:error, :failed} без контекста усложняет отладку. Передавайте структурированную причину: {:error, {:db_error, pg_code}}.
  • rescue Exception — слишком широко. Перехват базового Exception скрывает ErlangError, UndefinedFunctionError и системные ошибки. Указывайте конкретные типы.
  • after не подавляет исключение. Блок after выполняется, но исключение продолжает распространяться. Не путайте его с rescue.
  • Ecto changeset — не исключение. Repo.insert!/1 бросает при ошибке валидации; Repo.insert/1 возвращает {:error, changeset}. В продакшн-коде почти всегда предпочтителен второй вариант.

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

  • Сводить error handling к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: Elixir компилируется в BEAM bytecode и наследует процессы, message passing, supervision и hot-code friendly модель Erlang VM.
  • Не отделять validation, authorization, transaction boundary и business logic.

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

  • Объясняет error handling через конкретную точку lifecycle в Elixir.
  • Приводит корректный минимальный пример без вымышленных методов или callbacks.
  • Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.

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

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

Источники

  • https://hexdocs.pm/elixir/try-catch-and-rescue.html
  • https://hexdocs.pm/elixir/
←Предыдущий вопросЧто такое Erlang VM (BEAM) и какие преимущества она даёт Elixir?Следующий вопрос→В чём разница между `Enum` и `Stream` в Elixir?

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

ElixirBackend-Engineeringelixir-ecosystem

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

  • В чём разница между spawn, Task и GenServer для выполнения конкурентного кода?
  • Что такое pattern matching в Elixir и как он используется в ветвях функций (function clauses)?
  • В чём разница между модулем и структурой (struct) в Elixir?
  • Что такое иммутабельность в Elixir и почему она важна для параллелизма?