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.