檢視原始碼 Exception 行為 (Elixir v1.16.2)

用於格式化 throw/catch/exit 和例外的函式。

請注意,Elixir 中的堆疊追蹤僅可在 catch 和 rescue 中使用 __STACKTRACE__/0 變數存取。

請勿依賴此模組中 format* 函式傳回的特定格式。它們可能會在未來版本中變更,以更好地符合 Elixir 的工具鏈。換句話說,透過使用此模組中的函式,保證您將格式化例外,就像在目前使用的 Elixir 版本中一樣。

摘要

回呼

Exception.blame/3 呼叫以擴充例外結構。

接收傳遞給 raise/2 的參數,並傳回例外結構。

接收例外結構,並必須傳回其訊息。

函式

附加資訊至例外,以進行額外的偵錯。

責怪給定模組、函式和參數的呼叫。

標準化並格式化 throw/error/exit 和堆疊追蹤。

標準化並格式化任何 throw/error/exit。

格式化 exit。它傳回一個字串。

接收匿名函式和 arity,並以堆疊追蹤中顯示的方式格式化它。arity 也可能是參數清單。

格式化給定的 fileline,如堆疊追蹤中所示。

格式化給定的 filelinecolumn,如堆疊追蹤中所示。

接收模組、函式和 arity,並以堆疊追蹤中顯示的方式格式化它。arity 也可能是參數清單。

格式化堆疊追蹤。

接收堆疊追蹤條目並將其格式化為字串。

取得 exception 的訊息。

標準化例外,將 Erlang 例外轉換為 Elixir 例外。

類型

@type arity_or_args() :: non_neg_integer() | list()
@type kind() :: :error | non_error_kind()

由格式化函式處理的種類

@type location() :: keyword()
@type non_error_kind() :: :exit | :throw | {:EXIT, pid()}
@type stacktrace() :: [stacktrace_entry()]
@type stacktrace_entry() ::
  {module(), atom(), arity_or_args(), location()}
  | {(... -> any()), arity_or_args(), location()}
@type t() :: %{
  :__struct__ => module(),
  :__exception__ => true,
  optional(atom()) => any()
}

例外類型

回呼函式

連結到此回呼函式

blame(t, stacktrace)

檢視原始碼 (選用)
@callback blame(t(), stacktrace()) :: {t(), stacktrace()}

Exception.blame/3 呼叫以擴充例外結構。

可收集有關例外的其他資訊或執行其他昂貴的運算。

@callback exception(term()) :: t()

接收傳遞給 raise/2 的參數,並傳回例外結構。

預設實作接受一組關鍵字引數,這些引數會合併到結構中,或接受一字串作為例外的訊息。

@callback message(t()) :: String.t()

接收例外結構,並必須傳回其訊息。

大多數例外都有訊息欄位,預設會由這個函式存取。但是,如果例外沒有訊息欄位,則必須明確實作這個函式。

函式

連結到此函式

blame(kind, error, stacktrace)

檢視原始碼 (自 1.5.0 版起)
@spec blame(:error, any(), stacktrace()) :: {t(), stacktrace()}
@spec blame(non_error_kind(), payload, stacktrace()) :: {payload, stacktrace()}
when payload: var

附加資訊至例外,以進行額外的偵錯。

此操作可能很昂貴,因為它會從檔案系統讀取資料、剖析 beam 檔案、評估程式碼等。

如果例外模組實作選用的 blame/2 回呼函式,將會呼叫它來執行運算。

連結到此函式

blame_mfa(module, function, args)

檢視原始碼 (自 1.5.0 版起)
@spec blame_mfa(module(), function :: atom(), args :: [term()]) ::
  {:ok, :def | :defp | :defmacro | :defmacrop,
   [{args :: [term()], guards :: [term()]}]}
  | :error

責怪給定模組、函式和參數的呼叫。

此函式會從位元組碼中擷取可用的子句,並根據提供的引數評估它們。子句會以 {args, guards} 配對清單的形式傳回,其中每個引數和防護中的每個頂層條件都以 and/or 分隔,並以元組包含責難的元資料。

此函式會傳回 {:ok, definition, clauses}:error。其中 definition:def:defp:defmacro:defmacrop

連結到此函式

format(kind, payload, stacktrace \\ [])

檢視原始碼
@spec format(kind(), any(), stacktrace()) :: String.t()

標準化並格式化 throw/error/exit 和堆疊追蹤。

它仰賴 format_banner/3format_stacktrace/1 來產生最終格式。

如果 kind{:EXIT, pid},它不會產生堆疊追蹤,因為此類退出會作為沒有堆疊追蹤的訊息擷取。

連結到此函式

format_banner(kind, exception, stacktrace \\ [])

檢視原始碼
@spec format_banner(kind(), any(), stacktrace()) :: String.t()

標準化並格式化任何 throw/error/exit。

訊息的格式和顯示方式與 Elixir 的 CLI 所使用的格式相同。

第三個參數是堆疊追蹤,用於豐富正規化的錯誤,並提供更多資訊。它僅在 kind 為錯誤時使用。

@spec format_exit(any()) :: String.t()

格式化 exit。它傳回一個字串。

退出中通常會有錯誤/例外。退出通常由呼叫者包裝,並提供堆疊追蹤。此函式以一種方式格式化退出,以清楚顯示退出原因、呼叫者和堆疊追蹤。

@spec format_fa((... -> any()), arity()) :: String.t()

接收匿名函式和 arity,並以堆疊追蹤中顯示的方式格式化它。arity 也可能是參數清單。

範例

Exception.format_fa(fn -> nil end, 1)
#=> "#Function<...>/1"
連結到此函式

format_file_line(file, line, suffix \\ "")

檢視原始碼
@spec format_file_line(String.t() | nil, non_neg_integer() | nil, String.t()) ::
  String.t()

格式化給定的 fileline,如堆疊追蹤中所示。

如果任何值為 nil,則會省略。

範例

iex> Exception.format_file_line("foo", 1)
"foo:1:"

iex> Exception.format_file_line("foo", nil)
"foo:"

iex> Exception.format_file_line(nil, nil)
""
連結到此函式

format_file_line_column(file, line, column, suffix \\ "")

檢視原始碼
@spec format_file_line_column(
  String.t() | nil,
  non_neg_integer() | nil,
  non_neg_integer() | nil,
  String.t()
) :: String.t()

格式化給定的 filelinecolumn,如堆疊追蹤中所示。

如果任何值為 nil,則會省略。

範例

iex> Exception.format_file_line_column("foo", 1, 2)
"foo:1:2:"

iex> Exception.format_file_line_column("foo", 1, nil)
"foo:1:"

iex> Exception.format_file_line_column("foo", nil, nil)
"foo:"

iex> Exception.format_file_line_column("foo", nil, 2)
"foo:"

iex> Exception.format_file_line_column(nil, nil, nil)
""
連結到此函式

format_mfa(module, fun, arity)

檢視原始碼
@spec format_mfa(module(), atom(), arity_or_args()) :: String.t()

接收模組、函式和 arity,並以堆疊追蹤中顯示的方式格式化它。arity 也可能是參數清單。

範例

iex> Exception.format_mfa(Foo, :bar, 1)
"Foo.bar/1"

iex> Exception.format_mfa(Foo, :bar, [])
"Foo.bar()"

iex> Exception.format_mfa(nil, :bar, [])
"nil.bar()"

匿名函式會報告為 -func/arity-anonfn-count-,其中 func 是封閉函式的名稱。轉換為「func/arity 中的匿名函式」

連結到此函式

format_stacktrace(trace \\ nil)

檢視原始碼
@spec format_stacktrace(stacktrace() | nil) :: String.t()

格式化堆疊追蹤。

必須將堆疊追蹤作為參數提供。如果沒有,堆疊追蹤會從 Process.info/2 擷取。

連結到此函式

format_stacktrace_entry(entry)

檢視原始碼
@spec format_stacktrace_entry(stacktrace_entry()) :: String.t()

接收堆疊追蹤條目並將其格式化為字串。

@spec message(t()) :: String.t()

取得 exception 的訊息。

連結到此函式

normalize(kind, payload, stacktrace \\ [])

檢視原始碼
@spec normalize(:error, any(), stacktrace()) :: t()
@spec normalize(non_error_kind(), payload, stacktrace()) :: payload when payload: var

標準化例外,將 Erlang 例外轉換為 Elixir 例外。

它將 catch 溢出的 kind 作為參數,並僅正規化 :error,傳回其他未觸及的 payload。

第三個參數是堆疊追蹤,用於豐富正規化的錯誤,並提供更多資訊。它僅在 kind 為錯誤時使用。