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 はエラーコードから自動的に決まる。
  対応表がエラーコード一覧にあるので参照の事。
なお、gt4f90io の ライブラリ外 からユーザがエラー処理用ツール として StoreError を用いることを想定し、 USR_ECHAR および USR_INT を用意した。 このエラーコードを用いると、StoreError は以下の形式の文字列を 標準出力に出力してプログラムを終了させる。 なお、より安易に使えるラッパーとして dc_message モジュールを 用意してあるのでそちらも参照の事。
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)(ユーザ定義用) |