インテル® Fortran RTL は、可能な限り適切なメッセージを生成したり、エラーから復旧するために必要な処置を実行するなどの何らかのエラー処理を実行します。次の方法で、デフォルト動作を明示的に補足したり、代えることができます。
プログラム内のエラー処理コードに制御を移すには、I/O 文中で END、EOR、および ERR の分岐指定子を使用します。
インテル Fortran RTL エラーコード値に基づいて、Fortran 特有の I/O エラーを識別するには、I/O 文中で I/O 状態指定子 (IOSTAT) を使用します (または ERRSNS サブルーチンを呼び出します)。
適切なライブラリ・ルーチンを使用してシステムレベルのエラーコードを取得します。
特定のエラー状態の場合、信号処理機能でデフォルト動作を変更してください。
これらのエラー処理方法は同時に使用することができます。プログラマは、同じプログラム内で任意の方法またはすべての方法を使って、インテル Fortran のランタイムのエラーコードと Linux* システムのエラーコードを取得することができます。
インテル Fortran のプログラムの実行中に重大なエラーが起こった場合、デフォルト動作ではエラー・メッセージが表示され、プログラムが終了します。このデフォルト動作を変更するために、I/O 文には、プログラム中の特定の場所に制御を移す 3 つの分岐指定子が用意されています。
END 分岐指定子は、ファイル終了条件を処理します。
EOR 分岐指定子は、ノン・アドバンシング読み取りでのレコード終了条件を処理します。
ERR 分岐指定子は、すべてのエラー状態を処理します。
END、EOR、または ERR 分岐指定子を使用すると、エラー・メッセージは表示されず、実行は指定された文 (通常はエラー処理ルーチン) で続行されます。
エラー処理ルーチンが処理できない予期しないエラーが発生することがあります。この場合、次のいずれかを行います。
エラー処理ルーチンを変更して、エラー・メッセージ番号を表示するようにします。
エラーを引き起こす I/O 文から END、EOR、または ERR の各分岐指定子を削除します。
ソースコードを変更したら、プログラムのコンパイル、リンク、実行を行い、エラー・メッセージを表示させます。次に例を示します。
READ (8,50,ERR=400)
この文の実行中に重大なエラーが発生した場合、インテル Fortran RTL は制御を文番号 400 の文に移します。同じように、END 指定子を使うと、通常ならエラーとして処理されるファイル終了条件を処理することができます。次に例を示します。
READ (12,70,END=550)
ノン・アドバンシング I/O を使用しているときには、EOR 指定子を使ってレコード終了条件を処理します。次に例を示します。
150 FORMAT (F10.2, F10.2, I6)
READ (UNIT=20, FMT=150, SIZE=X, ADVANCE='NO', EOR=700) A, F, I
また、OPEN、CLOSE、または INQUIRE の文で、ERR を指定子として使用することもできます。次に例を示します。
OPEN (UNIT=10, FILE='FILNAM', STATUS='OLD', ERR=999)
この OPEN 文の実行中にエラーが検出されると、制御は文番号 999 の文に移ります。
IOSTAT 指定子を使うと、I/O エラーの発生後にプログラムの実行を続け、I/O 操作に関する情報を返すことができます。エラーによっては、IOSTAT に返されないものもあります。
IOSTAT 指定子は、END、EOR、および ERR による分岐転送を補足または置き換えることができます。IOSTAT 指定子を含む I/O 文が実行されると、エラー・メッセージの表示は禁止されます。また、整数変数、配列要素、またはスカラ・フィールド参照が次のいずれかに定義されます:
ノン・アドバンシング読み取りの際にレコード終了条件が発生した場合、値 -2。
ファイル終了条件が発生した場合、値 -1。
通常の完了の場合、値 0 (エラー状態、ファイル終了条件、レコード終了条件のいずれでもない場合)。
エラー状態が発生した場合、正の整数値。(この値は、ランタイム時のエラー・メッセージのリストにある Fortran 固有の IOSTAT 番号の 1 つです。詳細は、 「ランタイム時のエラー・メッセージ」を参照してください。
I/O 文の実行と IOSTAT 値の割り当てが行われた後、制御は (指定されている場合) END 文、EOR 文、または ERR 文の文番号に移ります。制御が移らない場合、通常の実行が続けられます。
プログラムに /opt/intel_fc_80/include/for_iosdef.for ファイルをインクルードすると、IOSTAT 値のシンボリック定義を利用できるようになります。
次の例は、IOSTAT 指定子と for_iosdef.for ファイルを使って、OPEN 文のエラー (FILE 指定子の中) を処理しています。
CHARACTER(LEN=40) :: FILNM
INCLUDE 'for_iosdef.for'
DO I=1,4
FILNM = ''WRITE (6,*)
'Type file name '
READ (5,*) FILNM
OPEN (UNIT=1, FILE=FILNM, STATUS='OLD', IOSTAT=IERR, ERR=100)
WRITE (6,*) 'Opening file: ', FILNM
! (process the input file)
CLOSE (UNIT=1)STOP
100 IF (IERR .EQ.FOR$IOS_FILNOTFOU) THEN
WRITE (6,*) 'File: ', FILNM, ' does not exist '
ELSE IF (IERR .EQ.FOR$IOS_FILNAMSPE) THEN
WRITE (6,*) 'File: ', FILNM, ' was bad, enter new file name'
ELSE PRINT *, 'Unrecoverable error, code =', IERR
STOPend if
END DO
WRITE (6,*) 'File not found.Type ls to find file and run again' END PROGRAM
END PROGRAM
エラーを取得する別の方法として、ERRSNS サブルーチンを使う方法があります。このサブルーチンは、インテル Fortran RTL エラー (詳細は、『Intel® Fortran Language Reference』(英語) を参照してください。) に関連した最後の I/O システムのエラーコードを取得します。