檢視原始碼 Exception 行為 (Elixir v1.16.2)
用於格式化 throw/catch/exit 和例外的函式。
請注意,Elixir 中的堆疊追蹤僅可在 catch 和 rescue 中使用 __STACKTRACE__/0
變數存取。
請勿依賴此模組中 format*
函式傳回的特定格式。它們可能會在未來版本中變更,以更好地符合 Elixir 的工具鏈。換句話說,透過使用此模組中的函式,保證您將格式化例外,就像在目前使用的 Elixir 版本中一樣。
摘要
函式
附加資訊至例外,以進行額外的偵錯。
責怪給定模組、函式和參數的呼叫。
標準化並格式化 throw/error/exit 和堆疊追蹤。
標準化並格式化任何 throw/error/exit。
格式化 exit。它傳回一個字串。
接收匿名函式和 arity,並以堆疊追蹤中顯示的方式格式化它。arity 也可能是參數清單。
格式化給定的 file
和 line
,如堆疊追蹤中所示。
格式化給定的 file
、line
和 column
,如堆疊追蹤中所示。
接收模組、函式和 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()}
例外類型
回呼函式
@callback blame(t(), stacktrace()) :: {t(), stacktrace()}
從 Exception.blame/3
呼叫以擴充例外結構。
可收集有關例外的其他資訊或執行其他昂貴的運算。
接收傳遞給 raise/2
的參數,並傳回例外結構。
預設實作接受一組關鍵字引數,這些引數會合併到結構中,或接受一字串作為例外的訊息。
接收例外結構,並必須傳回其訊息。
大多數例外都有訊息欄位,預設會由這個函式存取。但是,如果例外沒有訊息欄位,則必須明確實作這個函式。
函式
@spec blame(:error, any(), stacktrace()) :: {t(), stacktrace()}
@spec blame(non_error_kind(), payload, stacktrace()) :: {payload, stacktrace()} when payload: var
附加資訊至例外,以進行額外的偵錯。
此操作可能很昂貴,因為它會從檔案系統讀取資料、剖析 beam 檔案、評估程式碼等。
如果例外模組實作選用的 blame/2
回呼函式,將會呼叫它來執行運算。
@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
。
@spec format(kind(), any(), stacktrace()) :: String.t()
標準化並格式化 throw/error/exit 和堆疊追蹤。
它仰賴 format_banner/3
和 format_stacktrace/1
來產生最終格式。
如果 kind
是 {:EXIT, pid}
,它不會產生堆疊追蹤,因為此類退出會作為沒有堆疊追蹤的訊息擷取。
@spec format_banner(kind(), any(), stacktrace()) :: String.t()
標準化並格式化任何 throw/error/exit。
訊息的格式和顯示方式與 Elixir 的 CLI 所使用的格式相同。
第三個參數是堆疊追蹤,用於豐富正規化的錯誤,並提供更多資訊。它僅在 kind 為錯誤時使用。
格式化 exit。它傳回一個字串。
退出中通常會有錯誤/例外。退出通常由呼叫者包裝,並提供堆疊追蹤。此函式以一種方式格式化退出,以清楚顯示退出原因、呼叫者和堆疊追蹤。
接收匿名函式和 arity,並以堆疊追蹤中顯示的方式格式化它。arity 也可能是參數清單。
範例
Exception.format_fa(fn -> nil end, 1)
#=> "#Function<...>/1"
@spec format_file_line(String.t() | nil, non_neg_integer() | nil, String.t()) :: String.t()
格式化給定的 file
和 line
,如堆疊追蹤中所示。
如果任何值為 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)
""
@spec format_file_line_column( String.t() | nil, non_neg_integer() | nil, non_neg_integer() | nil, String.t() ) :: String.t()
格式化給定的 file
、line
和 column
,如堆疊追蹤中所示。
如果任何值為 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)
""
@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 中的匿名函式」
@spec format_stacktrace(stacktrace() | nil) :: String.t()
格式化堆疊追蹤。
必須將堆疊追蹤作為參數提供。如果沒有,堆疊追蹤會從 Process.info/2
擷取。
@spec format_stacktrace_entry(stacktrace_entry()) :: String.t()
接收堆疊追蹤條目並將其格式化為字串。
取得 exception
的訊息。
@spec normalize(:error, any(), stacktrace()) :: t()
@spec normalize(non_error_kind(), payload, stacktrace()) :: payload when payload: var
標準化例外,將 Erlang 例外轉換為 Elixir 例外。
它將 catch
溢出的 kind
作為參數,並僅正規化 :error
,傳回其他未觸及的 payload。
第三個參數是堆疊追蹤,用於豐富正規化的錯誤,並提供更多資訊。它僅在 kind 為錯誤時使用。