gtool4/Fortran90 reference - library - error handling

gtool4/Fortran 90 library document

## エラーの取り扱い

2000-08-28 豊田英司

## 概要

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

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

- エラーが発生すると適切なメッセージを表示してプログラム終了

- 論理型の省略できる引数 err が与えられた場合は、エラー時にはそれを真にする。err が省略された場合は上に同じ

これらの処理はすべて 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 を呼び出すようにしなければならない。そこで、新しいエラーコードを定義する必要があるかどうか　ｈｙｇｇｇを判定するために、エラーコードの値と対応するメッセージを一覧する。エラーコードニーモニックを使用するためには、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 層のエラーメッセージのため予約