Image: 中止 (A), 再試行 (R), 失敗 (F)?というイミフメッセージ [DOS]

Abort, Retry, Fail? - Wikipedia

DOSやWindows 9xのDOS窓で表示される「中止 (A), 再試行 (R), 失敗 (F)?」(英語ではAbort, Retry, Fail?) という確認メッセージは、ユーザーインターフェイスの悪い例として有名らしい(真偽は保証しない)。初めはしょうもない記事だなと思ったのだが、思い返してみれば私も最初はこれに戸惑った記憶がある。

これはMS-DOSがデバイスドライバに対してI/Oリクエストを渡し、そこで致命的エラー (critical-error) が発生したときにMS-DOS (COMMAND.COM)が標準で表示するメッセージだそうだ。例えば、ディスクがセットされていないドライブにアクセスしようとしたり、ディスクの物理的な損傷でデータの読み取りに失敗すると、このようなメッセージが表示される。

準備ができていません. 読み取り中 ドライブ B:
中止 (A), 再試行 (R), 失敗 (F)?

1行目はエラー内容によって変わるが、2行目は大体同じ。しかしこのメッセージ、プログラマーの目線で作られていて、ユーザーにとってはどの選択がどうなるのか分かりにくい。特に、ドライブ文字の間違いなどユーザー自身が操作ミスに気付いたとき、どれを選んでキャンセルすれば良いのか判断が付かない。もしここで「中止 (A)」を選ぶとアプリケーションが強制終了され、プロンプトに戻る。ユーザーは一瞬何が起きたか理解できず、コマンド入力待ちの画面を見てやがて茫然自失することになる。作業中のデータは吹っ飛んだのだと。

このメッセージが理解しにくいのは確かなようで、PC-98版MS-DOS 3.3Cのユーザーズガイド(初心者向けマニュアル)に「付録A : エラーメッセージQ&A」という章の最初にこのメッセージについて2ページ弱の解説がある。PC-98版MS-DOS 3.3はMS-DOS 3.21がベースであり、エラーメッセージは「中止<A>, もう一度<R>, 無視<I>?」として取り上げられている。

内部的には、このエラーメッセージを表示する処理はMS-DOSのシステム (MSDOS.SYS) がInt 24h(致命的エラー中断アドレス)という割り込みを発行し、COMMAND.COM内部の処理に推移することによって行われる。

Image: MS-DOS INT 24h
幸田敏記『MS-DOSデータブック ―MSDOS.SYSの仕組みと解析フローチャート―』3版(ラジオ技術社, 1988年)より。

従って、アプリケーションはInt 24hの割り込みベクターを書き換えることでエラー表示処理を自分のプログラムで行うことができる。ただし、最終的に「中止、再試行、失敗(無視)」のいずれかの応答ステータスをMSDOS.SYSに返す必要がある。どのアプリケーションもエラーメッセージの内容が似ているのはこういう理由がある。

Image: 一太郎 Ver.3

COMMAND.COMのInt 24h処理は順次文字を表示していくスタイルのアプリケーションには都合良いが、全画面でテキストやグラフィックを表示するアプリケーションには向かない。行儀の良いアプリケーションは最下行やウィンドウにメッセージを表示するなど適切にInt 24hを処理するのだが、そうでないアプリケーションはユーザーが誤って実行中のプログラムディスクを取り出すことなどによって、この確認メッセージが画面表示を破壊することになる。

各応答ステータスの意味はウィキペディアに書かれている通り。「中止」はMS-DOSがアプリケーションを直ちに終了させるため、状況によってはファイルを保存する途中で終了することになり、データ(成果物)を消失することになる。英語版MS-DOS 3.3で追加された「失敗」というのはリクエストを中止してアプリケーションに失敗したことを通知するという意味。日本IBMのPC DOSが出すメッセージはこれを明確にしている。

準備ができていません. 読取り中 ドライブ B
中止しますか(A), 再試行しますか(R), 失敗させますか(F)?

しかし、これもどちらかと言えばプログラマー目線の言い方で、ユーザーは混乱しそうだ。

このエラーメッセージはどう対処するのが正解だろう。単にディスクの挿入忘れなら挿入した後にR (再試行) を選べば良い。問題のドライブ名の入力誤りなどで操作を中止したい場合は、A (中止)ではなくR (再試行) を繰り返し、それがだめならF (失敗)かI (無視)を繰り返し選ぶのが安全だろう。アプリケーションによっては同じエラーメッセージを何回か出すかもしれないが、通常はこれを繰り返すと中止できる。ただ、これもアプリケーションによって対応が分かれるところ。

結局、これは後にデフォルトで「失敗」を返すよう強制するCOMMANDオプションが追加されたことから分かるように、一度処理を中止して後はアプリケーションに返せば良かった。ただ、CP/M時代はプログラムサイズの制限などからアプリケーションのエラー処理が単純だったので、MS-DOSはOS側で改善しようと対処したのだろう。これが初心者ユーザーの多くを混乱させることになるとは予想せず。

致命的エラーの一覧

DOS J5.0/Vでのエラーメッセージ 補足説明
書き込み禁止エラーです 書込禁止が設定されたディスクやCDにデータを書き込もうとした
装置が無効です デバイスが存在しないドライブ番号 (文字) にアクセスしようとした
準備ができていません ディスクがセットされていないドライブにアクセスしようとした
装置要求が正しくありません I/Oリクエストのコマンド番号が間違っている
データ・エラーです 読み取ったデータが破損している(CRC不一致)
装置要求パラメーターが正しくありません I/Oリクエストのコマンドパケットの長さが間違っている
シーク・エラーです デバイスやDOSが認識できないディスク、または、セクタID領域が破損している
メディアが正しくありません デバイスやDOSが対応していないフォーマットのディスクが挿入されている
セクターが見つかりません デバイスやDOSが認識できないディスク、または、セクタID領域が破損している
プリンターの用紙がありません そのままの意味
書込みエラーです そのままの意味
読取りエラーです そのままの意味
一般エラーです その他のエラー
共用違反です ネットワークで既に使用中のファイルへアクセスしようとした
ロック違反です ネットワークで既に使用中のファイルへアクセスしようとした

※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい.