Content-Type: text/html; charset=Shift_JIS
Page Title: Chapter 5 : DR-DOS System and Programmer's Guide (私訳)
[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 に示されています。
+-----+-----------------------------------------------------------------------+
|コー | 内容 |
| ド | |
+-----+-----------------------------------------------------------------------+
|0 |エラーなしNo error |
+-----+-----------------------------------------------------------------------+
|1 |無効なファンクション番号Illegal function |
+-----+-----------------------------------------------------------------------+
|2 |ファイルが見つからないFile not found |
+-----+-----------------------------------------------------------------------+
|3 |パスが見つからないPath not found |
+-----+-----------------------------------------------------------------------+
|4 |ファイルハンドル不足(オープンしているファイルが多すぎる)No file handl|
| |es (too many open files) |
+-----+-----------------------------------------------------------------------+
|5 |アクセス拒否Access denied |
+-----+-----------------------------------------------------------------------+
|6 |無効なファイルハンドルIllegal file handle |
+-----+-----------------------------------------------------------------------+
|7 |MCB(メモリコントロールブロック)が破壊されているMemory control block d|
| |estroyed |
+-----+-----------------------------------------------------------------------+
|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 atte|
| |mpted |
+-----+-----------------------------------------------------------------------+
|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 レジスタの内容が F
Fh にセットされているならばエラー発生状況にあり、ファンクションコールは期待通り
に終了していません。
以下の 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 (訳注 : D
R-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.