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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python16 420
  • Облачные технологии13 176
  • QA вакансии3 434
  • Backend вакансии2 036
  • Инженер данных1 679
  • Продакт-менеджер1 175

Разработка

  • Android1 816
  • iOS1 666
  • AI вакансии937
  • Fullstack вакансии892
  • Frontend вакансии717
  • Mobile вакансии38

По стеку

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

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

  • Kubernetes7 305
  • DevOps вакансии5 595
  • Linux-инфраструктура5 291
  • Terraform / IaC4 015
  • CI/CD2 559
  • Мониторинг и Observability1 735
  • SRE548
  • Кибербезопасность411

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

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

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

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

По регионам

  • Вакансии в США44 925
  • Вакансии в Европе21 347
  • Вакансии в Канаде4 453
  • Работа в России3 876

По формату

  • Удалённые вакансии74 108
  • Релокация в США44 925
  • Гибридная работа11 411
  • Офисная работа6 957

По уровню

  • Senior вакансии41 290
  • Middle вакансии20 424
  • Junior вакансии6 654

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

Все компании
  • Wise194 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab136 вакансий
  • Celonis45 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • 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 и почему она важна для параллелизма?