First, the official warning: exceptions in Elixir are not control-flow structures. Instead, Elixir exceptions are intended for things that should never happen in normal operation. That means the database going down or a name server failing to respond could be considered exceptional. Failing to open a configuration file whose name is fixed could be seen as exceptional. However, failing to open a file whose name a user entered is not. (You could anticipate that a user might mistype it every now and then.)
Raise an exception with the raise function. At its simplest, you pass it a string and it generates an exception of type RuntimeError.
iex> raise "Giving up"
** (RuntimeError) Giving up
You can also pass the type ...