ランタイム・エラーの処理

インテル® Fortran RTL は、可能な限り適切なメッセージを生成したり、エラーから復旧するために必要な処置を実行するなどの何らかのエラー処理を実行します。次の方法で、デフォルト動作を明示的に補足したり、代えることができます。

これらのエラー処理方法は同時に使用することができます。プログラマは、同じプログラム内で任意の方法またはすべての方法を使って、インテル Fortran のランタイムのエラーコードと Linux* システムのエラーコードを取得することができます。

END、EOR、および ERR 分岐指定子の使用

インテル Fortran のプログラムの実行中に重大なエラーが起こった場合、デフォルト動作ではエラー・メッセージが表示され、プログラムが終了します。このデフォルト動作を変更するために、I/O 文には、プログラム中の特定の場所に制御を移す 3 つの分岐指定子が用意されています。

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 指定子の使用

IOSTAT 指定子を使うと、I/O エラーの発生後にプログラムの実行を続け、I/O 操作に関する情報を返すことができます。エラーによっては、IOSTAT に返されないものもあります。

IOSTAT 指定子は、END、EOR、および ERR による分岐転送を補足または置き換えることができます。IOSTAT 指定子を含む I/O 文が実行されると、エラー・メッセージの表示は禁止されます。また、整数変数、配列要素、またはスカラ・フィールド参照が次のいずれかに定義されます:

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 システムのエラーコードを取得します。