Class | dc_error |
In: |
dc_error.f90
|
Note that Japanese and English are described in parallel.
プログラムの部品は必ずエラーの取り扱いを明確に規定すべきものです。 エラーとは当該部品への入力が不適切であるとか、 期待される動作をすることができないといった事態を指します。
gt4f90io ライブラリがユーザに提供する手続 (手続とはサブルーチンまたは関数の総称) はほとんどの場合、 以下の 2 つの方式のいずれかで呼び出し元にエラーを報告します。
これらの処理はすべて dc_error モジュールの StoreError サブルーチンで行っています。引用仕様などに関しては StoreError を参照してください。
Error handling about parts of programs should be regulated definitely. Error means that input to the part of program is invalid, or expected operation can not be done, etc.
Procedures (procedures is generic name of subroutines and functions) provided to users by gt4f90io library almost report error to invoker in the following two manner.
StoreError subroutine in dc_error module handle above all operations. See StoreError about the interfase of it.
gt4f90io ライブラリにコードを追加するプログラマは適切な エラーコードで StoreError を呼び出すようにしなければなりません。 そこで、 新しいエラーコードを定義する必要があるかどうかを 判定するために、 エラーコードの値と対応するメッセージを 以下に一覧します。 エラーコードニーモニックを使用するためには、 NF_E で始まる名前については netcdf_f77 モジュールを引用するか include ‘netcdf.inc’ を行い(後者は推奨しません)、 GT_E, DC_E, HST_E で始まる名前については dc_error モジュールを引用してください。 また USR_ERRNO 番より小さい値は、 各々のユーザが適宜エラーコードを 定義して利用するために空けてあります。
エラーではない状態を表す非エラーコードは DC_NOERR です。
エラーコードの数値の欄を設けたのは、新たなエラーコードを 割り当てる際の指針を示すためです。 ソースコードにはエラーコードをニーモニックで与えるべきであり、 数値をハードコードすることは厳に慎んで下さい。
Programmers who add codes to gt4f90io library must call StoreError with appropriate error code. And so values of error code and corresponding messages are listed as follows to figure out if a new error code is needed to declared. To use error codes mnemonic, require "netcdf_f77" module or include "netcdf.inc" (deprecated) about error codes with prefix NF_E, or require "dc_error" module about error codes with prefix GT_E and DC_E and HST_E. Error codes smaller than USR_ERRNO are saved as user-defined error codes.
Non error code that indicates normal (error-free) situation is DC_NOERR.
List of numerical values of error codes issues a guideline about declaration of new error codes. Give not numerical value but mnemonic of error code to source code.
正の整数値はエラーコードとして使用しません。
NetCDF ライブラリは libc のエラーコード errno を返す可能性があり、 errno の数値には移植性がないため、全ての正の整数値は errno の仕様のために予約されているべきだからです。
Positive integer is not used as error codes.
NetCDF library might return "libc" error code "error". Numerical value of "errno" is no portable, so positive integer should be reserved for "errno".
以下の非エラーコードに関しては dc_error モジュールを引用することで 利用してください。
Use following non error code by refering this "dc_error" module.
数値. Number : | [ ニーモニック. Mnemonic ] |
0 : | [ DC_NOERR ] |
以下のエラーコードに関しては netcdf_f77 モジュールを引用することで 利用してください。
Use following error codes by refering this "netcdf_f77" module.
数値. Number : | [ ニーモニック. Mnemonic ] エラーメッセージ. Error message | ||
0 : | [ NF_NOERR ]
| ||
-33 : | [ NF_EBADID ]
| ||
-34 : | [ NF_ENFILE ]
| ||
-35 : | [ NF_EEXIST ]
| ||
-36 : | [ NF_EINVAL ]
| ||
-37 : | [ NF_EPERM ]
| ||
-38 : | [ NF_ENOTINDEFINE ]
| ||
-39 : | [ NF_EINDEFINE ]
| ||
-40 : | [ NF_EINVALCOORDS ]
| ||
-41 : | [ NF_EMAXDIMS ]
| ||
-42 : | [ NF_ENAMEINUSE ]
| ||
-43 : | [ NF_ENOTATT ]
| ||
-44 : | [ NF_EMAXATTS ]
| ||
-45 : | [ NF_EBADTYPE ]
| ||
-46 : | [ NF_EBADDIM ]
| ||
-47 : | [ NF_EUNLIMPOS ]
| ||
-48 : | [ NF_EMAXVARS ]
| ||
-49 : | [ NF_ENOTVAR ]
| ||
-50 : | [ NF_EGLOBAL ]
| ||
-51 : | [ NF_ENOTNC ]
| ||
-52 : | [ NF_ESTS ]
| ||
-53 : | [ NF_EMAXNAME ]
| ||
-54 : | [ NF_EUNLIMIT ]
| ||
-55 : | [ NF_ENORECVARS ]
| ||
-56 : | [ NF_ECHAR ]
| ||
-57 : | [ NF_EEDGE ]
| ||
-58 : | [ NF_ESTRIDE ]
| ||
-59 : | [ NF_EBADNAME ]
| ||
-60 : | [ NF_ERANGE ]
| ||
-61 : | [ NF_ENOMEM ]
| ||
-62~-99: |
|
以下のエラーコードに関しては dc_error モジュールを引用することで 利用してください。
Use following error codes by refering this "dc_error" module.
数値. Number : | [ ニーモニック. Mnemonic ] エラーメッセージ. Error message | ||
-100 : | [ GT_EFAKE ]
| ||
-101 : | [ GT_ENOMOREDIMS ]
| ||
-102 : | [ GT_EDIMNODIM ]
| ||
-103 : | [ GT_EDIMMULTIDIM ]
| ||
-104 : | [ GT_EDIMOTHERDIM ]
| ||
-105 : | [ GT_EBADDIMNAME ]
| ||
-106 : | [ GT_ENOTVAR ]
| ||
-107 : | [ GT_ENOMEM ]
| ||
-108 : | [ GT_EOTHERFILE ]
| ||
-109 : | [ GT_EARGSIZEMISMATCH ]
| ||
-110 : | [ GT_ENOMATCHDIM ]
| ||
-111 : | [ GT_ELIMITED ]
| ||
-112 : | [ GT_EBADVAR ]
| ||
-113 : | [ GT_ECHARSHORT ]
| ||
-114 : | [ GT_ENOUNLIMITDIM ]
| ||
-115 : | [ GT_EBADATTRNAME ]
| ||
-116 : | [ GT_EBADHISTORY ]
| ||
-117 : | [ GT_EBADALLOCATESIZE ]
| ||
-118 : | [ GT_ERANKMISMATCH ]
| ||
-119 : | [ GT_ENOTURL ]
| ||
-120 : | [ GT_EBADGT4COMMAGRAPHY ]
| ||
~-299 : |
|
以下のエラーコードに関しては dc_error モジュールを引用することで 利用してください。
Use following error codes by refering this "dc_error" module.
数値. Number : | [ ニーモニック. Mnemonic ] エラーメッセージ. Error message | ||
-300 : | [ GR_ENOTGR ]
| ||
~-399 : |
|
以下のエラーコードに関しては dc_error モジュールを引用することで 利用してください。
Use following error codes by refering this "dc_error" module.
数値. Number : | [ ニーモニック. Mnemonic ] エラーメッセージ. Error message | ||
-400 : | [ DC_ENOTINIT ]
| ||
-401 : | [ DC_EALREADYINIT ]
| ||
-402 : | [ DC_EBADUNIT ]
| ||
-403 : | [ DC_EBADCALTYPE ]
| ||
-404 : | [ DC_EBADTIMEZONE ]
| ||
-405 : | [ DC_EFILENAMEEMPTY ]
| ||
-406 : | [ DC_EBADFILEOPMODE ]
| ||
-407 : | [ DC_ENOUNITNUM ]
| ||
-408 : | [ DC_ENOFILEEXIST ]
| ||
-409 : | [ DC_ENOFILEREAD ]
| ||
-410 : | [ DC_ENOFILEWRITE ]
| ||
-411 : | [ DC_ENEGATIVE ]
| ||
-412 : | [ DC_EARGLACK ]
| ||
-413 : | [ DC_ENOASSOC ]
| ||
-414 : | [ DC_ENOENTRY ]
| ||
-414~-499 : |
|
以下のエラーコードに関しては dc_error モジュールを引用することで 利用してください。
Use following error codes by refering this "dc_error" module.
数値. Number : | [ ニーモニック. Mnemonic ] エラーメッセージ. Error message | ||
-500 : | [ HST_ENOTINDEFINE ]
| ||
-501 : | [ HST_EINDEFINE ]
| ||
-502 : | [ HST_EINTFILE ]
| ||
-503 : | [ HST_EBADNAME ]
| ||
-504 : | [ HST_ENOTTERMGTHIST ]
| ||
-505 : | [ HST_ENODEPENDTIME ]
| ||
-506 : | [ HST_EBADVARNAME ]
| ||
-507 : | [ HST_ENOTIMEDIM ]
| ||
-508 : | [ HST_ENOAXISNAME ]
| ||
-509 : | [ HST_EVARINUSE ]
| ||
-510 : | [ HST_EALREADYPROGRESS ]
| ||
-511 : | [ HST_EBADSLICE ]
| ||
-512 : | [ HST_EBADNEWFILEINT ]
| ||
-513 : | [ HST_EMAXDIMSDEPENDED ]
| ||
-514 : | [ HST_EINDIVISIBLE ]
|
以下のエラーコードは今後の拡張も考えて予約してある部分です。
Following error codes are reserved for future extensions.
数値. Number : | [ ニーモニック. Mnemonic ] エラーメッセージ. Error message | ||
-600~-999 : |
|
-1000 よりも小さいエラーコードは、 gt4f90io の上位のプログラムが利用するエラーコードとして空けてあります。
Error codes smaller than -1000 are saved for as user-defined error codes used by upper programs.
数値. Number : | [ ニーモニック. Mnemonic ] エラーメッセージ. Error message | ||
-1000~ : | [ USR_ERRNO ]
|
Subroutine : |
GetErrorMessage からエラーメッセージを取得後、 それを sysdep#AbortProgram に渡してプログラムを終了させます。
Get error messages from "GetErrorMessage", and put the messages to sysdep#AbortProgram, and stop the program.
Original external subprogram is dc_error.f90#DumpError
Function : | |
result : | integer |
現在設定されているエラーコードを返します。
Return an error code specified currently.
integer function ErrorCode() result(result) ! ! 現在設定されているエラーコードを返します。 ! ! Return an error code specified currently. ! result = errno end function ErrorCode
Subroutine : | |
msg : | character(len = *), intent(out) |
現在設定されているエラーコードから対応するメッセージを返します。
Return messages corresponding to an error code specified currently.
subroutine GetErrorMessage(msg) ! ! 現在設定されているエラーコードから対応するメッセージを返します。 ! ! Return messages corresponding to an error code specified currently. ! use netcdf_f77, only: nf_strerror character(len = *), intent(out):: msg character(len = STRING):: message character(len = 20):: errno_c character(len = 20):: cause_int_c continue select case(errno) case(GT_EFAKE) msg = ' function not implemented' ! ! -101 以下: データ構造のエラー ! -101 or less: Error of data structure ! case(GT_ENOMOREDIMS) write(message, "(': dimension number', i4, ' is out of range')") cause_int msg = trim(message) case(GT_EBADDIMNAME) msg = '(' // trim(cause_string) // '): unknown dimension name' case(GT_ENOTVAR) msg = ' variable not opened' case(GT_ENOMEM) msg = ' allocate/deallocate error' case(GT_EDIMNODIM) msg = ' dimension variable has no dimension' case(GT_EDIMMULTIDIM) msg = ' dimension variable has many dimensions' case(GT_EDIMOTHERDIM) msg = ' dimension variable has another dimension' case(GT_EOTHERFILE) msg = ' specified dimensional variable not on the same file' case(GT_EARGSIZEMISMATCH) msg = ' arguments (' // trim(cause_string) //') array size mismatch' case(GT_ENOMATCHDIM) msg = ' dimension matching failed' case(GT_ELIMITED) msg = ' variable already limited' case(GT_EBADVAR) msg = ' variable type not supported' case(GT_ECHARSHORT) msg = ' character length not enough' case(GT_ENOUNLIMITDIM) msg = ' NC_UNLIMITED dimension is not found' case(GT_EBADATTRNAME) msg = ' invalid attribute name' case(GT_EBADALLOCATESIZE) msg = ' invalid allocated size' case(GT_ERANKMISMATCH) msg = ' rank of data and argument are mismatch (' // trim(cause_string) // ')' case(GT_ENOTURL) msg = ' URL (' // trim(cause_string) // ') is not found' case(GT_EBADGT4COMMAGRAPHY) msg = ' (' // trim(cause_string) // ') is not gtool4 comma-graphy (ex. "time=100.0,x=10:20,y=^1:^5")' ! ! -300 以下: GrADS 入出力のエラー ! -300 or less: Error of GrADS I/O ! case(GR_ENOTGR) msg = ' invalid GrADS file' ! ! -400 以下: DC ユーティリティのエラー ! -400 or less: Error of DC utilities ! case(DC_ENOTINIT) msg = ' object (' // trim(cause_string) // ') is not initialized' case(DC_EALREADYINIT) msg = ' object (' // trim(cause_string) // ') is already initialized' case(DC_EBADUNIT) msg = ' unit (' // trim(cause_string) // ') is invalid' case(DC_EBADCALTYPE) write(message, '(" calendar type (", i4, ") is invalid")') cause_int msg = trim(message) case(DC_EBADTIMEZONE) msg = ' time zone (' // trim(cause_string) // ') is invalid' case(DC_EFILENAMEEMPTY) msg = ' filename is empty' case(DC_EBADFILEOPMODE) msg = ' file open mode (' // trim(cause_string) // ') is invalid' case(DC_ENOUNITNUM) msg = ' available unit number is not found within (' // trim(cause_string) // ')' case(DC_ENOFILEEXIST) msg = ' file (' // trim(cause_string) // ') is not found' case(DC_ENOFILEREAD) msg = ' file (' // trim(cause_string) // ') is not readable' case(DC_ENOFILEWRITE) msg = ' file (' // trim(cause_string) // ') is not writable' case(DC_ENEGATIVE) msg = ' negative value is invalid for (' // trim(cause_string) // ')' case(DC_EARGLACK) msg = ' lack of arguments (' // trim(cause_string) // ')' case(DC_ENOASSOC) msg = ' argument (' // trim(cause_string) // ') is not associated' case(DC_ENOENTRY) msg = ' entry of (' // trim(cause_string) // ') is not found' ! ! -500 以下: データ入出力層のエラー ! -500 or less: Error of data I/O layer ! case(HST_ENOTINDEFINE) msg = ' operation (' // trim(cause_string) // ') not allowed in data mode' case(HST_EINDEFINE) msg = ' operation (' // trim(cause_string) // ') not allowed in define mode' case(HST_EINTFILE) msg = ' different intervals are applied to a file (' // trim(cause_string) // ')' case(HST_EBADNAME) msg = ' name (' // trim(cause_string) // ') is invalid' case(HST_ENOTTERMGTHIST) msg = ' GT_HISTORY correspond to (' // trim(cause_string) // ') is not terminated' case(HST_ENODEPENDTIME) msg = ' (' // trim(cause_string) // ') does not depend on time' case(HST_EBADVARNAME) msg = ' variable name (' // trim(cause_string) // ') is invalid' case(HST_ENOTIMEDIM) msg = ' time dimension is not found' case(HST_ENOAXISNAME) msg = ' axis or weight (' // trim(cause_string) // ') is not found' case(HST_EVARINUSE) msg = ' variable name (' // trim(cause_string) // ') is already used' case(HST_EALREADYPROGRESS) msg = ' already progressed by (' // trim(cause_string) // ')' case(HST_EBADSLICE) msg = ' slice options are invalid (' // trim(cause_string) // ')' case(HST_EBADNEWFILEINT) msg = ' invalid newfile interval (' // trim(cause_string) // ')' case(HST_EMAXDIMSDEPENDED) write(message, '("(", i4, ")")') cause_int msg = trim(message) msg = ' variable (' // trim(cause_string) // ') depends on ' // trim(message) // ' dimensions' case(HST_EINDIVISIBLE) msg = ' (' // trim(cause_string) // ') can not be divided' ! ! ! -1000 以下: ユーザー定義 ! -1000 or less: User-defined error ! case(:USR_ERRNO) if (len(trim(adjustl(cause_string))) < 1) then cause_string = 'Unknown error' end if if (cause_int_valid) then write(cause_int_c, "(i8)") cause_int msg = trim(cause_string) // ' (' // trim(adjustl(cause_int_c)) // ')' else msg = trim(cause_string) end if case default goto 999 end select write(errno_c, "(i8)") errno msg = '*** ERROR (Code ' // trim(adjustl(errno_c)) // ') [' // trim(cause_location) // '] *** ' // trim(msg) return 999 continue if (len(cause_string) > 0) then message = nf_strerror(errno) write(errno_c, "(i8)") errno msg = '*** ERROR (Code ' // trim(adjustl(errno_c)) // ') [' // trim(cause_location) // '(' // trim(cause_string) // ')] *** ' // trim(message) else if (cause_int_valid) then message = nf_strerror(errno) write(errno_c, "(i8)") errno write(cause_int_c, "(i8)") cause_int msg = '*** ERROR (Code ' // trim(adjustl(errno_c)) // ') [' // trim(cause_location) // '(' // trim(adjustl(cause_int_c)) // ')] *** ' // trim(message) else message = nf_strerror(errno) write(errno_c, "(i8)") errno msg = '*** ERROR (Code ' // trim(adjustl(errno_c)) // ') [' // trim(cause_location) // '] *** ' // trim(message) endif end subroutine GetErrorMessage
Constant : | |
NF_EINVAL = -36 : | integer, parameter |
Original external subprogram is netcdf_f77#NF_EINVAL
Constant : | |
NF_ENOTVAR = -49 : | integer, parameter |
Original external subprogram is netcdf_f77#NF_ENOTVAR
Subroutine : | |||
number : | integer, intent(in)
| ||
where : | character(len = *), intent(in)
| ||
err : | logical, intent(out), optional
| ||
cause_c : | character(len = *), intent(in), optional
| ||
cause_i : | integer, intent(in), optional
|
必要な引数は2つであり、第1引数 number には整数型のエラーコード、 第2引数 where には文字型でエラーの発生した手続名を与えます。 デフォルトでは以下の形式の文字列が標準出力に表示されてプログラム は終了します。 エラーメッセージ error_message はエラーコードから自動的に決まります。 対応表がエラーコード一覧にあるので参照してください。
Number of necessary arguments is two. Give integer error code to first argument number, and procedure name where the error occurs to second argument where. By default, like a following string is displayed to standard output, and the program aborts Error message <error_message> is determined by error code automatically. See error code list.
*** ERROR (Code number) [where] *** error_message *** ERROR (Code number) [where(cause_c)] *** error_message
なお、gt4f90io のライブラリ外からユーザがエラー処理用ツール として StoreError を用いることを想定し、USR_ERRNO 番より小さい エラーコードは空けてあります。USR_ERRNO より小さい値をエラーコードに与えると, StoreError は以下の形式の文字列を標準出力に出力してプログラムを 終了させます。より安易に使えるメッセージ出力およびエラー発生の ためのモジュールとして dc_message も用意してあるので そちらも参照してください。
In addition, for usage that users call StoreError as an error handling tool from the outside of gt4f90io library, error codes smaller than USR_ERRNO is saved. When error codes smaller than USR_ERRNO is given, StoreError displays like a following string to standard output, and stops the program. dc_message module is prepared too. This module can be used more easily for message output and rise of error.
*** ERROR (Code number) [where] *** cause_c *** ERROR (Code number) [where] *** cause_c (cause_i)
subroutine StoreError(number, where, err, cause_c, cause_i) ! !== 典型的ライブラリ手続のために作られたエラー処理サブルーチン !== Error handling subroutine for typical procedures of library ! ! 必要な引数は2つであり、第1引数 *number* には整数型のエラーコード、 ! 第2引数 *where* には文字型でエラーの発生した手続名を与えます。 ! デフォルトでは以下の形式の文字列が標準出力に表示されてプログラム ! は終了します。 エラーメッセージ error_message ! はエラーコードから自動的に決まります。 ! 対応表がエラーコード一覧にあるので参照してください。 ! ! Number of necessary arguments is two. Give integer error code ! to first argument *number*, and procedure name where the error ! occurs to second argument *where*. By default, like a following ! string is displayed to standard output, and the program aborts ! Error message <error_message> is determined by error code automatically. ! See error code list. ! ! ! *** ERROR (Code number) [where] *** error_message ! ! *** ERROR (Code number) [where(cause_c)] *** error_message ! ! なお、gt4f90io のライブラリ外からユーザがエラー処理用ツール ! として StoreError を用いることを想定し、<b><tt>USR_ERRNO</tt></b> ! 番より小さい ! エラーコードは空けてあります。<b><tt>USR_ERRNO</tt></b> ! より小さい値をエラーコードに与えると, ! StoreError は以下の形式の文字列を標準出力に出力してプログラムを ! 終了させます。より安易に使えるメッセージ出力およびエラー発生の ! ためのモジュールとして *dc_message* も用意してあるので ! そちらも参照してください。 ! ! In addition, for usage that users call StoreError as an error ! handling tool from the outside of gt4f90io library, ! error codes smaller than <b><tt>USR_ERRNO</tt></b> is saved. ! When error codes smaller than <b><tt>USR_ERRNO</tt></b> is given, ! StoreError displays like a following string to standard output, ! and stops the program. ! *dc_message* module is prepared too. This module can be used ! more easily for message output and rise of error. ! ! ! *** ERROR (Code number) [where] *** cause_c ! ! *** ERROR (Code number) [where] *** cause_c (cause_i) ! ! integer, intent(in) :: number ! エラーコード。 ! Error code character(len = *), intent(in) :: where ! エラー発生個所。 ! Place where error occurs logical, intent(out), optional :: err ! 例外処理用フラグ。 ! デフォルトでは、*number* に非エラーコード ! 以外の値が与えられた場合、エラーメッセージを ! 表示してプログラムは強制終了します。 ! 引数 *err* が与えられる場合、 ! プログラムは強制終了せず、代わりに ! *err* に .true. が代入されます。 ! ! Exception handling flag. ! By default, when error code (excluding ! non error code) is given to *number*, ! the program display error message and aborts. ! If this *err* argument is given, ! .true. is substituted to *err* and ! the program does not abort. character(len = *), intent(in), optional :: cause_c ! 文字型メッセージ。 ! Character message integer, intent(in), optional :: cause_i ! 整数型メッセージ。 ! Integer message continue if (present(err)) then err = (number /= DC_NOERR) return endif if (number == DC_NOERR) return errno = number cause_location = where if (present(cause_c)) then cause_string = trim(cause_c) else cause_string = "" endif if (present(cause_i)) then cause_int = cause_i cause_int_valid = .true. else cause_int_valid = .false. end if call DumpError end subroutine StoreError