gtool4/Fortran 90 library document

エラーの取り扱い

2000-08-28 豊田英司


概要

プログラムの部品は必ずエラーの取り扱いを明確に規定すべきものである。エラーとは当該部品への入力が不適切であるとか、期待される動作をすることができないといった事態である。

gtool4/Fortran 90 ライブラリがユーザに提供する手続 (手続とはサブルーチンまたは関数の総称) はほとんどの場合、以下の2つの方式のいずれかで呼び出し元にエラーを報告する。

これらの処理はすべて dc_error モジュールの StoreError サブルーチンで行っている。StoreError は以下のような引用仕様を持つ。

subroutine StoreError(number, where, err, cause_s, cause_i)
    use DC_STRING
    integer, intent(in):: number
    character(len = *), intent(in):: where
    logical, intent(out), optional:: err
    type(VSTRING), intent(in), optional:: cause_s
    integer, intent(in), optional:: cause_i
end subroutine

必要な引数は2つであり、第1引数は整数型のエラーコード、第2引数は文字型でエラーの発生した手続名を与える。デフォルトでは

where: error_message

	または

where(cause_s): error_message

の形式の文字列が端末に表示されてプログラムは終了する。

エラーコード一覧

gtool4 ライブラリにコードを追加するプログラマは適切なエラーコードで StoreError を呼び出すようにしなければならない。そこで、新しいエラーコードを定義する必要があるかどうか hygggを判定するために、エラーコードの値と対応するメッセージを一覧する。エラーコードニーモニックを使用するためには、NF_E で始まる名前については netcdf_f77 モジュールを引用するか include 'netcdf.inc' を行い(後者は推奨されない)、GT_E で始まる名前については dc_error モジュールを引用する。

エラーコードの数値の欄を設けたのは新たなエラーコードを割り当てる際の指針を示すためである。コードではエラーコードをニーモニックで与えるべきであり、数値をハードコードすることは厳に慎まれたい。

数値 ニーモニック エラーメッセージ
(正の値) なし (NetCDF ライブラリは libc のエラーコード errno を返す可能性がある。errno の数値には移植性がないため、すべての正の整数値は errno の仕様のために予約されている)
0 NF_NOERR No Error
-33 NF_EBADID Not a netCDF id: 
-34  NF_ENFILE Too many netCDF files open:
-35 NF_EEXIST netCDF file exists && NC_NOCLOBBER:
-36  NF_EINVAL Invalid argument:
-37 NF_EPERM Write to read only:
-38 NF_ENOTINDEFINE Operation not allowed in data mode
-39 NF_EINDEFINE Operation not allowed in define mode
-40 NF_EINVALCOORDS Index exceeds dimension bound
-41 NF_EMAXDIMS NC_MAX_DIMS exceeded
-42 NF_ENAMEINUSE String match to name in use
-43 NF_ENOTATT Attribute not found
-44 NF_EMAXATTS NC_MAX_ATTRS exceeded
-45 NF_EBADTYPE Not a netCDF data type or _FillValue type mismatch
-46 NF_EBADDIM Invalid dimension id or name
-47 NF_EUNLIMPOS NC_UNLIMITED in the wrong index
-48 NF_EMAXVARS NC_MAX_VARS exceeded
-49 NF_ENOTVAR Variable not found
-50 NF_EGLOBAL Action prohibited on NC_GLOBAL varid
-51 NF_ENOTNC Not a netCDF file
-52 NF_ESTS In Fortran, string too short
-53 NF_EMAXNAME NC_MAX_NAME exceeded
-54 NF_EUNLIMIT NC_UNLIMITED size already in use
-55 NF_ENORECVARS NC_rec op when there are no record vars
-56 NF_ECHAR Attempt to convert between text & numbers
-57 NF_EEDGE Edge+start exceeds dimension bound
-58 NF_ESTRIDE Illegal stride
-59 NF_EBADNAME Attribute or variable name contains illegal characters
-60 NF_ERANGE Numeric conversion not representable
-61 NF_ENOMEM Memory allocation (malloc) failure
-62〜-99   (将来の netCDF の拡張に備えた gtool4 の予約領域)
-100 GT_EFAKE function not implemented
-101 GT_ENOMOREDIMS dimension number %d is out of range
-102 GT_EDIMNODIM dimension variable has no dimension
-103 GT_EDIMMULTIDIM dimension variable has many dimensions
-104 GT_EDIMOTHERDIM dimension variable has another dimension
-105〜-199   将来の gtdata 層のエラーメッセージのため予約
-200 GT_EFIGNOHAXIS horizontal axis is missing
-201 GT_EFIGNOVAXIS vertical axis is missing
-202以下の数値   将来の gtgraph 層のエラーメッセージのため予約