[Front] [Prev Chapter] [Next Chapter] [in English]

エラー処理

システムコールのエラー処理
致命的エラーの処理


5.1 システムコールのエラー処理

大部分の DR-DOS システムコールは、呼出処理を正常に終了できなかった時、エラー情報を返します。 返される情報の種類は個々のコールによって変化します。 「ハンドル」型のファンクションコールは、エラー状態を呼び出し元プログラムに知らせるため、キャリーフラグと AX レジスタを使用し、対して「FCB」型のコールは AL レジスタを使用します。 すべてのシステムコールで拡張エラー情報が利用可能です。

5.1.1「ハンドル」型ファンクションコール

アプリケーションプログラムは、キャリーフラグの状態を調べることにより、ハンドル型ファンクションコール間に起こったであろうエラーの状況を調べることができます。 キャリーフラグがセットされている場合、プログラムは AX レジスタの内容を確認することでエラー状況の種類を特定できます。 以下のハンドル型コールは AX にエラーコードを返します。

38h - 43h

44h (サブファンクション 0Eh, 0Fh)

45h - 4Bh

4Eh, 4Fh

56h, 57h

5Ah

5Ch

65h

67h, 68h

AX の値とその内容は Table 5-1 に示されています。

Table 5-1
拡張エラーコード
コード 内容
0 エラーなし No error
1 無効なファンクション番号 Illegal function
2 ファイルが見つからない File not found
3 パスが見つからない Path not found
4 ファイルハンドル不足 (オープンしているファイルが多すぎる) No file handles (too many open files)
5 アクセス拒否 Access denied
6 無効なファイルハンドル Illegal file handle
7 MCB(メモリコントロールブロック)が破壊されている Memory control block destroyed
8 メモリ不足 Insufficient memory
9 無効なメモリブロックアドレス Illegal memory block address
10 無効な環境 Invalid environment
12 無効なアクセスコード Invalid access code
13 無効なデータ Invalid data
15 無効なドライブ指定 Invalid drive specified
16 カレントディレクトリを削除しようとした Removal of current directory attempted
17 デバイスが一致しない Devices do not match
18 これ以上のファイルはない No more files
19 ライトプロテクトのかかったディスクに書き込もうとした Attempted write on protected disk
20 ディスクユニットが未定義、もしくは不良 Unit unknown
21 ドライブの準備ができていない Drive not ready
22 無効なディスクコマンド Command unknown
23 CRC エラー CRC error
24 デバイスドライバに渡す、コマンドリクエストストラクチャの長さが正しくない Bad request structure length
25 シークエラー Seek error
26 メディアタイプが不明。 DOS 用のディスクではない Media type unknown
27 セクタが見つからない Sector not found
28 プリンタ用紙切れ Printer out of paper
29 書き込み失敗 Write failure
30 読み込み失敗 Read failure
31 その他全般の失敗 General failure
32 共有違反 Sharing violation
33 ロック違反 Lock violation
35 FCB 使用不能 File Control Block not available
80 ファイルはすでに存在 File already exists
82 サブディレクトリ作成不能 Cannot create subdirectory
83 致命的エラー処理ハンドラ (INT 24h) の処理失敗 Critical error failure
86 無効なパスワード Invalid password

5.1.2 FCB 型ファンクションコール

FCB 型ファンクションコールを使用するアプリケーションプログラムは、AL レジスタの内容を検査することで、エラー状況を確認することもできます。 AL レジスタの内容が FFh にセットされているならばエラー発生状況にあり、ファンクションコールは期待通りに終了していません。

以下の FCB 型ファンクションコールは、AL レジスタ経由でエラー状態を提供します。

0Fh - 13h

16h, 17h

23h, 29h

2Bh, 2Dh

5.1.3 拡張エラー情報

通知されたエラーの正確な原因に関するよりくわしい情報は、アプリケーションプログラムが拡張エラーコード取得 (59h) を直接呼び出せば取得できます。 このファンクションコールは AX、BH、BL、CH レジスタの4項目に情報を返します。 エラーコードは AX に返されます。 エラークラスは BH に、推奨レスポンスは BL に、影響したリソースは CH に返されます。 エラークラス、レスポンス、リソースのよりくわしい情報は Chapter 4 内のファンクションコール 59h、拡張エラーコード取得の記述中にあります。

5.2 致命的エラーの処理

致命的エラーの処理は、3.5 INT 24h -- Critical Error Handler の中で議論されています。

アプリケーションプログラムは、自前の致命的エラー処理ルーチンを用意することができます。 アプリケーションの初期化コードは INT 24h ベクタを保存し、アプリケーションエラールーチンのスタートアドレスを新しい INT 24h ベクタとして置き換えます。 DR-DOS が致命的エラーを検出した結果として INT 24h が発生したときに、このエラールーチンが制御を得ることになります。 エラールーチンの入力時、DI レジスタの下位バイトはエラーコードを格納しています。 このコードの値は Table 3-3 で示され、Table 5-1 の 19 から 31 までのコードに対応するものです。

エラーに対するユーザの応答を取得するために、エラールーチンは、DR-DOS (訳注 : DR-DOS がデフォルトで用意しているユーザ応答ルーチン。 "Abort, Retry, Ignore" とか出てくる例のアレ) に制御を戻すことができます。 ユーザ応答を取得するには、スタック上にフラグレジスタを PUSH し、以前に保存しておいた INT 24h ベクタのアドレスを FAR CALL します。 DR-DOS はユーザ応答の要求を発行し、アプリケーション側エラールーチンの、FAR CALL 直後の命令位置に戻ります。

エラールーチンはそれから、アプリケーションのニーズに合わせたエラー処理にはいります。 アプリケーション内の致命的エラー発生位置に戻るために、エラー処理ルーチンが必要とするのは IRET 命令の実行のみです。

エラールーチンが、ユーザ応答のために DR-DOS に制御を戻すことは、義務ではありません。 自前でのエラー処理を選択することもできます。 そのようにする場合、エラールーチンは、アプリケーションに制御を戻す前にスタックのクリーンアップ処理も行わねばなりません。 これは、アプリケーションプログラムのレジスタがスタックから POP され、IRET 命令が実行されることを伴います。 致命的エラーハンドラ入力時のスタック配置は、Figure 3-1 に図示されています。

致命的エラー処理ルーチンには、前述したように、拡張エラー情報取得のため、拡張エラーコード取得 (59h) ファンクションを実行することが認められています。 たとえば、DI の値によって「ドライブの準備ができていない (02h)」とされている致命的エラーが、実際のところ「共有違反」によるものである場合がありえます。 この原因はファンクション 59h 経由で判別できます。


Copyright (c) 1993, 1997 Caldera, Inc All rights reserved.