Packages

An example implementation for an Elixir custom runtime on AWS Lambda

Current section

Files

Jump to
aws_lambda_elixir_runtime lib elixir_runtime monitor error.ex
Raw

lib/elixir_runtime/monitor/error.ex

# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
defmodule ElixirRuntime.Monitor.Error do
@moduledoc """
This module defines the Error struct which is used to communicate runtime
errors to the Lambda Runtime Service.
"""
alias __MODULE__
@derive Poison.Encoder
defstruct [
:errorMessage,
:errorType,
:stackTrace
]
@type error_type :: :function | :runtime
@type error :: %Error{
errorMessage: String.t(),
errorType: String.t(),
stackTrace: list
}
@doc "Build an Error from a structured process-exit reason"
@spec from_exit_reason(error_type, {atom(), list()}) :: error
def from_exit_reason(error_type, _reason = {error, stacktrace}) do
exception = Exception.normalize(:error, error, stacktrace)
build_error(error_name(error_type, exception), exception, stacktrace)
end
@doc "Build an Error from an unknown process-exit reason"
@spec from_exit_reason(error_type, term) :: error
def from_exit_reason(error_type, reason) do
exception = Exception.normalize(:error, {"unexpected exit", reason})
build_error(error_name(error_type, exception), exception, [])
end
defp error_name(:function, %{__struct__: name, __exception__: true}) do
"Function#{name}"
end
defp error_name(:runtime, %{__struct__: name, __exception__: true}) do
"Runtime#{name}"
end
defp error_name(:function, _) do
"FunctionUnknownError"
end
defp error_name(:runtime, _) do
"RuntimeUnknownError"
end
defp build_error(error_type, err, stacktrace) do
%Error{
errorMessage: Exception.format(:error, err),
errorType: error_type,
stackTrace: Enum.map(stacktrace, &Exception.format_stacktrace_entry/1)
}
end
# Old Code
@doc "Build an Error struct from a runtime error"
def from(error_type, err, stacktrace) do
build_error(error_name(error_type, err), err, stacktrace)
end
end