プログラムの実行中に、エラーまたは例外条件が発生する場合があります。これらは、以下のような原因で発生します。
I/O 操作中に発生するエラー
無効な入力データ
算術ライブラリの呼び出しにおける引数エラー
算術エラー
他のシステム検出エラー
インテル® Fortran ランタイム・ライブラリ (RTL) は、適切なメッセージを生成し、可能な場合はエラーから回復するための処置を実行します。
Fortran RTLで認識される各エラーに対して、デフォルトの処理が定義されています。明示的にエラー処理方法が指定されない限り、この章で説明されているデフォルトの処理が行なわれます。
Fortran RTL が実際にエラーを処理する方法は、以下の要因によって異なります。
エラーの重要度。例えば、重要度が "warning" または "info" (情報) のエラー・メッセージが検出された場合、通常、プログラムは実行を続行します。
I/O 文に関連する特定のエラーに対して、I/O エラー処理指定子が指定された場合と指定されなかった場合。
特定のエラーに対して、関連する信号のデフォルトの処理が変更された場合と変更されなかった場合。
算術演算に関係する特定のエラー (浮動小数点例外を含む) に対して、コンパイル・オプションによって、エラーを通知するかどうか、また通知するエラーの重要度を決定できます。
算術例外条件の通知および処理方法は、例外の原因とプログラムのコンパイル方法によって異なります。プログラムが例外を処理できるようにコンパイルされなければ、例外条件の原因となった命令の後まで例外は通知されない可能性があります。エラーと例外の処理に関するコンパイラ・オプションは次のとおりです。
-check bounds オプションは、特定の条件を検出するためのコードを生成します。
-check noformat オプションおよび -check nooutput_conversion オプションは、ランタイム・エラーの重要度を下げ、プログラムの実行を続行します。
プログラム実行中 (ランタイム) にエラーが発生すると、Fortran RTL は診断メッセージを発行します。これらのランタイム・メッセージの形式は次のとおりです。
forrtl: severity (nnn): message-text
各アイテムの意味は次のとおりです。
forrtl は、メッセージの発行元がインテル Fortran RTL であることを示します。
severity は、重要度レベル (severe、error、warning、または info) を示します。
nnn は、メッセージ番号を示します。また、I/O 文の IOSTAT の値でもあります。
message-text は、メッセージの原因となったイベントの説明です。
次に、ランタイム・メッセージの重要度について、重要度の高いものから説明します。
メッセージの重要度レベルが severe の場合、問題を修正する必要があります。プログラムの I/O 文で END、EOR、ERR 各分岐指定子を使用して、IOSTAT 指定子を使用するルーチンなどに制御を渡さない限り、プログラムの実行はエラー検出時に終了します。
メッセージの重要度レベルが error の場合、問題を修正する必要があります。プログラムの実行を続行できても、出力に誤りがある可能性があります。
メッセージの重要度レベルが warning の場合、問題を調査する必要があります。プログラムの実行は続行しますが、出力に誤りがある可能性があります。
重要度レベルが info のメッセージは、情報提供のみを目的としています。プログラムは続行されます。
重要度レベルが severe のエラーでは、環境変数 FOR_DISABLE_STACK_TRACE が設定されていない限り、スタックトレース情報がデフォルトで表示されます。-traceback コマンド・ライン・オプションが設定されている場合、スタックトレース情報にはシンボリック情報に対して設定されたプログラム・カウンタが含まれています。それ以外の場合、スタックトレース情報には単なる 16 進数のプログラム・カウンタ情報が含まれます。
場合によっては、スタックトレース情報はコンパイルされたコードによってランタイム時に生成され、配列の一時変数の作成に関する詳細を提供します。
FOR_DISABLE_STACK_TRACE が設定されている場合、スタックトレース情報は生成されません。
次のスタックトレース情報に関する例を参照してください。プログラムは、12 行目でエラーを表示します。
program ovf
real*4 x(5),y(5)
integer*4 i
x(1) = -1e32
x(2) = 1e38
x(3) = 1e38
x(4) = 1e38
x(5) = -36.0
do i=1,5
y(i)
= 100.0*(x(i))
print
*, 'x = ', x(i), ' x*100.0 = ',y(i)
end do
end
> ifort -O0 -fpe0 -traceback
ovf.f90 -o ovf.exe
> ovf.exe
x = -1.0000000E+32
x*100.0
= -1.0000000E+34
(1)
forrtl: error (72): floating overflow
Image PC
Routine
Line
Source
ovf.exe 08049E4A
MAIN__
14
ovf.f90
ovf.exe 08049F08
Unknown
Unknown
Unknown
ovf.exe 400B3507
Unknown
Unknown
Unknown
ovf.exe 08049C51
Unknown
Unknown
Unknown
Abort
> setenv FOR_DISABLE_STACK_TRACE
true
> ovf.exe
x = -1.0000000E+32
x*100.0
= -1.0000000E+34
forrtl: error (72): floating overflow (2)
Abort
次の情報は、上記の例の右端に記述された番号に関する情報です。
(1) トレースバック情報が存在する場合のスタックトレース情報です。
(2) FOR_DISABLE_STACK_TRACE 環境変数が設定されているため、スタックトレース情報は生成されません。
インテル Fortran プログラムは、次のいずれかの方法で終了させることができます。
プログラムが正常終了するまで実行する。ゼロの値がシェルに返されます。
プログラムが STOP 文または PAUSE 文で中止する。ゼロの値がシェルに返されます。
信号が検出され、それがプログラムの続行を許容しないためにプログラムが中止する。1 の値がシェルに返されます。
プログラムが重要なランタイム・エラーのために中止する。そのランタイム・エラーのエラー番号がシェルに返されます。
プログラムが CALL EXIT 文で中止する。EXIT に渡された値がシェルに返されます。
通常は core ファイルを作成しない重要なエラーに対して、強制的にコアダンプを実行することができます。プログラムを実行する前に、decfort_dump_flag 環境変数に True の値 (Y、y、Yes、yEs、True など) を設定して、重要なエラーで core ファイルを作成させます。例えば、次の C シェルコマンドで decfort_dump_flag 環境変数を設定します。
setenv decfort_dump_flag y
core ファイルは、カレント・ディレクトリに書き込まれ、デバッガを使用して調査できます。
注
重要なエラーに対してコアファイルを作成するように要求しているにも関わらず、ファイルが期待どおりに作成されない場合、プロセス制限でコアファイルの利用可能なサイズが低く設定されている (またはゼロに設定されている) 可能性があります。プロセス制限の設定に関する詳細は、シェルのメインページを参照してください。例えば、C シェルコマンド limit (引数なし) は、現在の設定を通知します。また、limit coredumpsize unlimited はコアファイルの利用可能なサイズを現在のシステムで可能な最大サイズまで許可します。