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)
(ユーザ定義用) |