ok and error tuples

Contents
Return {:ok, value}
Return {:error, reason}
Handle with with
Bang functions or raise

Return {:ok, value}

Elixir functions signal success with a two element tuple tagged with the atom ok. Callers match on the tag instead of guessing from the value shape. Wrapping the result keeps success explicit even when the value itself could be anything.

defmodule Calc do def divide(a, b) do {:ok, a / b} end end IO.inspect(Calc.divide(7, 2))

{:ok, 3.5}

Return {:error, reason}

Failure uses the same shape with the atom error and a reason term such as an atom. A dedicated clause matches the bad input first, so the main clause only sees valid data. Callers then branch on the tag instead of rescuing an exception.

defmodule Calc do def divide(_a, 0) do {:error, :zero_division} end def divide(a, b) do {:ok, a / b} end end IO.inspect(Calc.divide(7, 0))

{:error, :zero_division}

Handle with with

The with construct chains steps that each return ok tuples and stops at the first mismatch. Each generator matches its pattern, and the do body runs only when every step succeeds. The else branch receives the unmatched value, so one place handles all failure shapes.

with {:ok, data} <- File.read("notes.txt") do IO.puts(data) else {:error, reason} -> IO.puts("missing: #{reason}") end

When the file exists the body prints its text, otherwise the else branch prints the reason.

Bang functions or raise

Many File functions come in pairs: the plain form returns an ok or error tuple while the bang form ends with an exclamation mark. The bang form returns the value directly and raises when something goes wrong. Reach for it when failure should stop the process instead of branching.

data = File.read!("notes.txt") IO.puts(data)

Next: Files and IO

Article author: Arthur Isaev

Related articles
Elixir
Elixir course: zero to hero in 50 lessons
What is Elixir and where it runs
Install Elixir
iex: the interactive shell
Your first script
Variables
Numbers
Strings
Atoms
Truthiness: only false and nil
Conditions
Recursion replaces loops
Lists
Tuples
Maps
Keyword lists
Functions
Defaults and clauses
Pattern matching
case
with chains
Modules in Elixir
import, alias, require, use in Elixir
Structs in Elixir
Protocols in Elixir
Behaviours in Elixir
The pipe operator in Elixir
Enum in Elixir
Stream in Elixir
Comprehensions in Elixir
Advanced strings in Elixir
Sigils
Binaries and charlists
Exceptions
ok and error tuples
Files and IO
Processes
GenServer
Supervisors
Tasks and Agents
OTP applications
Mix projects
Dependencies
Testing with ExUnit
Doctests
Debugging
Configs
Releases
Capstone: todo CLI
Capstone: HTTP server
Hero roadmap: the whole course on one page
Install Elixir on Windows 11
Install Elixir on Ubuntu
Install Elixir on Rocky Linux
Install Elixir on macOS
Install Elixir on FreeBSD
Elixir in Docker
Banner image

Search this site

Channel @aofeed Chat @aofeedchat

Contacts and cooperation:
I recommend our hosting beget.com
Write to info@aredel.com if you:
1. Want to write an article for our site or translate an article into your native language.
2. Want to place thematically relevant ads on the site.
3. Ads on my site pass maximum censorship. If you see an ad block unsuitable for school-age children, shocking or misleading - please contact us by e-mail
4. Found a mistake, inaccuracy, bug, etc. on the site. ... .......
5. Articles can be shared on social media by clicking a network icon: