Elixir: FunctionClauseError
Elixirでパターンマッチする関数節がない場合のエラー
概要
Elixirで関数を呼び出した際に、引数にマッチする関数節(clause)が見つからない場合に発生するエラーです。
エラーメッセージ
** (FunctionClauseError) no function clause matching in MyModule.my_function/1
(my_app) lib/my_module.ex:5: MyModule.my_function(:unexpected)
原因
- パターンの網羅性不足: すべての入力パターンをカバーしていない
- 型の不一致: 期待する型と異なる引数が渡された
- ガード条件の不備: ガード条件がfalseになるケースがある
- nil の未処理: nilが渡されることを想定していない
解決策
1. デフォルト節を追加
| |
2. ガード条件を緩和
| |
3. nil を明示的に処理
| |
4. with 構文で安全に処理
| |
5. case 式で明示的にマッチ
| |
6. Dialyzer で型チェック
| |
7. 入力検証を追加
| |
8. 関数節の順序に注意
| |
よくある間違い
- リストの先頭・残りパターン
[head | tail]で空リストを考慮していない - マップのキーが存在しない場合を考慮していない
- バイナリパターンマッチでサイズが足りない
- 再帰の終了条件がない
Elixir の他のエラー
この記事は役に立ちましたか?