/blunder

A common error struct for elixir apps

Primary LanguageElixir

Blunder

A common error struct for elixir apps

Usage

Blunder structs give you a common, expressive error type to rase in exceptions return in {:error, %Blunder{}} tuples. This gives you a lot more expressiveness than {:error, "error string"}. The %Blunder{} struct has the following properties you can set.

  • code - An atom describing the error in a machine-readable way. Defaults to :application_error
  • summary - A short description of the error, suitable for display to users
  • details - A more detailed description of the error, suitable for logging or alerting.
  • severity - An atom indicating of the severity of the error, can be used to determine what to log, for example.
  • stacktrace - Allows you to attach a stacktrace to the error, nil by default
  • original_error - The original error if this Blunder error is wrapping a lower-level exception

In order to simplify the creation of these error structs you're encouraged to create an Errors module in your app that exports functions for creating Blunder errors. This serves as a conveniance as well as a central place to document error types. Blunder provides the deferror macro in Blunder.Errors to make this easier.

defmodule MyApp.Errors do
  import Blunder.Errors

  deferror :flagrant_system_error, 
    message: "MUCH ERRORZ!",
    severity: :critical

  deferror :boring_error, message: "whatevs"
end

defmodule MyApp.DoTheWork do
  import MyApp.Errors

  def add(x, y) do
    case get_system_status do
      :server_is_on_fire -> {:error, flagrant_system_error()},
      :server_is_le_tired -> {:error, boring_error()},
      :server_ready_to_work -> {:ok, x + y},
    end
  end
end