Skip to content

エラーモデル

Spreadsheet error は first-class value です。#DIV/0! を返した数式はクラッシュしておらず、error 値を生成しただけです。それを取得したホスト API 呼び出しは成功しています。この区別はすべての binding で保たれます。

用語: セルエラーとホスト失敗

セルエラーkind = Error の値であり、binding を通じてデータとして流れます。ホスト失敗 はホスト操作自体の失敗(bytes 不正・ハンドル失効・IO エラー・engine 内部失敗)であり、別チャネル ─ Status envelope / 例外 / 非ゼロ終了 / fm_status_t ─ で報告されます。

Error意味
#DIV/0!0 除算
#VALUE!型または値の不一致
#REF!無効な参照(削除されたシート、壊れた range)
#NAME?未知の名前または関数
#NUM!数値オーバーフロー / 不正な数値 domain
#N/A値が利用できない
#NULL!範囲交差が空
#SPILL!動的配列の spill 衝突
#CALC!engine が結果を返せない
#GETTING_DATA外部参照の取得中

binding はこれらを host exception に変換せず、値として保持してください(API 誤用・IO 失敗を報告する場合を除く)。

ホスト側の失敗経路

Surfaceホスト側の失敗経路
WASMstatus.ok === false または invalid workbook handle + lastErrorMessage()
PythonFormulonError
CLI非ゼロ終了コード + stderr 診断
C ABI非ゼロ fm_status_t + fm_last_error_message() / fm_last_error_context()
MCP構造化 payload を持つ MCP エラー応答
Native Node返却 envelope の status.ok === false

C ABI の値種別

Kind意味
FM_VAL_BLANK空セル
FM_VAL_NUMBERIEEE-754 double
FM_VAL_BOOL真偽値
FM_VAL_TEXTUTF-8 のワークブック所有テキストビュー
FM_VAL_ERRORExcel エラーコードの序数
FM_VAL_ARRAY予約済み payload
FM_VAL_REF予約済み payload
FM_VAL_LAMBDA予約済み payload

処理パターン

ts
const value = wb.getValue(0, 0, 0)
if (value.kind === ValueKind.Error) {
  // セルエラー ─ UI 上で示すだけ。throw しない
  showInline(value.errorText)
} else if (value.kind === ValueKind.Number) {
  consume(value.number)
}
python
v = wb.get_value(0, 0, 0)
if v.kind is ValueKind.ERROR:
    show_inline(v.error_text)
elif v.kind is ValueKind.NUMBER:
    consume(v.number)

次に読むもの