gt4f90io リファレンスマニュアル

エラーの取り扱い

2004/12/24 森川靖大


概要

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

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

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

subroutine StoreError(number, where, err, cause_c, cause_i)

    use dc_string

    integer     , intent(in)            :: number  ! エラーコード
    character(*), intent(in)            :: where   ! エラー発生
    logical     , intent(out), optional :: err
    character(*), intent(in),  optional :: cause_c ! 文字型メッセージ
    integer     , intent(in),  optional :: cause_i ! 整数型メッセージ

end subroutine

必要な引数は2つであり、第1引数 number は整数型のエラーコード、 第2引数 where は文字型でエラーの発生した手続名を与える。 デフォルトでは以下の形式の文字列が標準出力 に表示されてプログラムは終了する。 エラーメッセージ error_message はエラーコードから自動的に決まる。 対応表がエラーコード一覧にあるので参照の事。

 *** ERROR (Code number) [where] ***  error_message

 *** ERROR (Code number) [where(cause_c)] ***  error_message

なお、gt4f90io の ライブラリ外 からユーザがエラー処理用ツール として StoreError を用いることを想定し、 USR_ECHAR および USR_INT を用意した。 このエラーコードを用いると、StoreError は以下の形式の文字列を 標準出力に出力してプログラムを終了させる。 なお、より安易に使えるラッパーとして dc_message モジュールを 用意してあるのでそちらも参照の事。

 *** ERROR (Code USR_ECHAR) [where] ***  cause_c

 *** ERROR (Code USR_EINT) [where] ***  cause_c (cause_i)


エラーコード一覧

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

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

利用しないコード

数値 ニーモニック エラーメッセージ
(正の値) なし (NetCDF ライブラリは libc のエラーコード errno を返す可能性がある。errno の数値には移植性がないため、すべての正の整数値は errno の仕様のために予約されている)

netCDF に関するエラーコード

数値 ニーモニック エラーメッセージ
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 の予約領域)

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 GT_EBADDIMNAME string_c または string_s: unknown dimension name
-106 GT_ENOTVAR variable not opened
-107 GT_ENOMEM allocate/deallocate error
-108 GT_EOTHERFILE specified dimensional variable not on the same file
-109 GT_EARGSIZEMISMATCH argument array size mismatch
-110 GT_ENOMATCHDIM dimension matching failed
-111 GT_ELIMITED variable already limited
-112 GT_EBADVAR variable type not supported
-113 GT_ECHARSHORT character length not enough
-114 GT_ENOUNLIMITDIM NC_UNLIMITED dimension is not found
-115〜-199   (将来の gtdata 層のエラーメッセージのため予約)

gtool4 の可視化に関するエラーコード

数値 ニーモニック エラーメッセージ
-200 GT_EFIGNOHAXIS horizontal axis is missing
-201 GT_EFIGNOVAXIS vertical axis is missing
-202 GT_EBADLINK bad variable reference
-203〜-299   (将来の gtgraph 層のエラーメッセージのため予約)

GrADS に関するエラーコード

数値 ニーモニック エラーメッセージ
-300 GR_ENOTGR invalid GrADS file
-301〜-399   (将来の GrADS インターフェース層のエラーメッセージのため予約)

gtool4 に関して予約してあるエラーコード

数値 ニーモニック エラーメッセージ
-400〜-999   (将来の gt4f90io の内部のエラーメッセージのため予約)

ユーザ定義用エラーコード

数値 ニーモニック エラーメッセージ
-1000 USR_ECHAR string_c
(ユーザ定義用)
-1001 USR_EINT string_c (string_i)
(ユーザ定義用)