Code Fix

中級

match式で該当する条件が無いと UnhandledMatchError になる

match式は該当するcaseが1つも無いと、switch文のように黙って何もしないのではなく、UnhandledMatchErrorという例外を投げます。想定していない値が来た場合の安全装置として働きます。

エラーメッセージの読み方

Fatal error: Uncaught UnhandledMatchError: Unhandled match case 'F' in main.php:3
main.php
ファイル名
3
行番号 — 実際にクラッシュした行
UnhandledMatchError
例外クラス — 何が起きたか。ここを検索するのが最短です
Unhandled match case 'F'
内容 — どの値が問題だったか

このエラーが出る典型パターン

パターン1

 1  <?php
 2  $grade = "F";
              ^
 3  $point = match ($grade) {
 4      "A" => 4,
 5      "B" => 3,
 6  };
 7  echo $point;
Fatal error: Uncaught UnhandledMatchError: Unhandled match case 'F' in main.php:3

match式はswitchと違い、該当するcaseが無いと黙って通り抜けません。UnhandledMatchErrorを投げてプログラムを止めます。

直し方: "F""A" にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  <?php
 2  $status = 3 ;
               ^
 3  $label = match ($status) {
 4      1 => "active",
 5      2 => "inactive",
 6  };
 7  echo $label;
Fatal error: Uncaught UnhandledMatchError: Unhandled match case 3 in main.php:3

matchに該当するcaseが無いとUnhandledMatchErrorになります。想定外の値をそのまま渡さないよう、事前の検証かdefault相当のcaseが必要です。

直し方: 31 にします。

この問題を解いてみる →

パターン3

 1  <?php
 2  $size = "L" ;
              ^
 3  $px = match ($size) {
 4      "S" => 12,
 5      "M" => 16,
 6  };
 7  echo $px;
Fatal error: Uncaught UnhandledMatchError: Unhandled match case 'L' in main.php:3

sizeに"L"のような未定義のケースを渡すとUnhandledMatchErrorになります。matchはswitchのフォールスルーのような黙って無視する挙動をしません。

直し方: "L""M" にします。

この問題を解いてみる →

よくある誤解

「matchもswitchと同じで、該当が無ければ何もせず通り抜けるはず」という思い込みは誤りです。matchは該当なしを許さない設計で、defaultに相当するものが無ければ必ず例外になります。

まとめ

match式で該当する条件が無いと UnhandledMatchError になるは中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)