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 の仕様のために予約されている) |
数値 | ニーモニック | エラーメッセージ |
---|---|---|
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 | 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 層のエラーメッセージのため予約) |
数値 | ニーモニック | エラーメッセージ |
---|---|---|
-200 | GT_EFIGNOHAXIS | horizontal axis is missing |
-201 | GT_EFIGNOVAXIS | vertical axis is missing |
-202 | GT_EBADLINK | bad variable reference |
-203〜-299 | (将来の gtgraph 層のエラーメッセージのため予約) |
数値 | ニーモニック | エラーメッセージ |
---|---|---|
-300 | GR_ENOTGR | invalid GrADS file |
-301〜-399 | (将来の GrADS インターフェース層のエラーメッセージのため予約) |
数値 | ニーモニック | エラーメッセージ |
---|---|---|
-400〜-999 | (将来の gt4f90io の内部のエラーメッセージのため予約) |
数値 | ニーモニック | エラーメッセージ |
---|---|---|
-1000 | USR_ECHAR | string_c (ユーザ定義用) |
-1001 | USR_EINT | string_c (string_i)
(ユーザ定義用) |