例外処理
例外処理
ここで述べる例外には、以下の2種類があります。
- mapping definition からのソースコード生成時の例外
- デコード/エンコード処理時の例外
1. ソースコード生成時の例外
ソースコード生成時は、 XSLT で例外を検出します。 例外を検出した際は、エラーメッセージを出力すると共に、コード生成を行う Java プログラムへ例外を通知します。
エラーメッセージの出力形式を統一するために、エラーメッセージ出力用の <xsl:template name="error"> を使用します。 この template を使用して出力するエラーメッセージは以下のようになります。
# Error - mapping definition ファイル名 line:行番号 column:列番号 element:<要素名> "エラーメッセージ."
XSLT が検出する 例外は限られたものです。 原理的には XSLT で判定可能な項目でも、実装が複雑になるような項目は ランタイムで検出します。
[参照ファイル]
src/raw/common.xsl
src/raw/check.xsl
設計メモ:XSLT で検出した例外の処理
2. デコード/エンコード処理時の例外
umsCodeGeneratotr が生成するデコード/エンコード処理では、 各種のランタイムエラーを検出します。 デコード/エンコード処理中に例外を検出した際には、次の情報を収集します。
- 例外発生の有無
- エラーコード
- 例外の詳細情報
- 例外検出時の mapping definition ファイル名
- 例外検出時の mapping definition 行番号
- 例外検出時の mapping definition 列番号
- 例外検出時の mapping definition 要素名
- データの処理位置(bit)
- スタックトレース情報
なお、例外情報は、デフォルトでは次のフォーマットで出力します。
エラーメッセージ
-- input data --
at line 行番号, column 列番号
at byte バイト数, bit ビット数
Address| 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
-------+------------------------------------------------
xxxx | 入出力データのバイナリ表示
|
~ エラー発生箇所の指定
-- mapping definition --
mapping definition ファイル名
at line:行番号, column:列番号, element:<要素名>, "エラーメッセージ"
詳細情報
at line:行番号, column:列番号, element:<要素名>, "エラーメッセージ"
詳細情報
:
2.1 言語ごとの例外処理
デコード/エンコード処理時に検出した例外の処理機構は、C 言語と Java で異なります。 Java では、標準の例外処理機構を用いて処理しますが、C 言語は例外処理機構を備えていません。 そこで、Java と同様な処理になるように、例外処理機構を設けています。
設計メモ: ユーザのためのエラーメッセージ・開発者のためのデバッグメッセージ
2.1.1 C 言語での例外処理
C言語では、構造体 "ums__exception_t" を用いて例外情報を保持します。
[参照ファイル]
src/clng/umsException.h
Java の例外処理機構を模擬するために関数形式マクロを定義し、例外処理を行います。 使用する関数形式マクロは以下の通りです。
なお、本マクロを使用する際には、関数名を格納する変数 "FUNCTION" に、 ユーザーがあらかじめ関数名を格納しておく必要があります。
マクロ | 役割 |
---|---|
throw | 例外を検出した際に、例外情報を送出する。 戻り値が void 型の関数で用います。 |
throwWithValue | 例外を検出した際に、例外情報を送出する。 戻り値がvoid型以外の関数で用い、指定された値で return する。 |
catchAndThrow | 受け取った例外情報を、そのまま送出する。 戻り値が void 型の関数で用いる。 |
catchAndThrowWithValue | 受け取った例外情報をそのまま送出する。 戻り値が void 型以外の関数で用い、で指定された値で return する。 |
catch | 例外を受け取る。 |
[参照ファイル]
src/clng/umsException.h
2.1.2 Java での例外処理
Java では、Exception クラスを継承した UMSException クラスを定義し、 例外情報を保持します。
[参照ファイル]
src/java/jp/jaxa/isas/ums/runtime/UMSException.java
Java では、例外処理機構を用いて例外処理を行います。
2.2 エラーコード体系
例外の種別ごとに、10進6桁のエラーコードを対応させています。 エラーコードの各桁は、次のルールに基づいて数値を割り振ります。
WWXYZZ
WW: 例外種別
X :ツール
Y :検出箇所
ZZ:通番
以下の番号は、umsCodeGenerator で使用しています。
桁 | エラーコード | 説明 |
---|---|---|
WW | 10 | ソースコード生成エラー |
20 | 致命的エラー | |
30 | データが定義とマッチしない | |
X | 1 | umsCodeGenerator |
Y | 1 | datatypeLibrary関数 |
2 | decode・encode関数 | |
3 | 生成ソースコード | |
4 | ユーザーが作成するソースコード |
umsCodeGeneratorに標準で定義されている、例外検出場所、エラーコード、 エラーメッセージは以下の通りです。
例外種別 | 例外検出ファイル | エラーコード | エラー種別 |
---|---|---|---|
ソースコード生成エラー | datatypeLibrary関数 | 101101 | データのbit長が定義と一致しない |
ソースコード生成エラー | datatypeLibrary関数 | 101103 | データのbit長が定義を超える |
ソースコード生成エラー | decode・encode関数 | 101209 | コンテナのネストが深すぎる |
ソースコード生成エラー | decode・encode関数 | 101211 | ループのネストが深すぎる |
致命的エラー | datatypeLibrary関数 | 201104 | 書き込みバッファを超過する |
致命的エラー | decode・encode関数 | 201204 | 書き込みバッファを超過する |
致命的エラー | decode・encode関数 | 201205 | 読み込みバッファを超過する |
致命的エラー | decode・encode関数 | 201206 | 配列のサイズを超過する |
致命的エラー | decode・encode関数 | 201900 | 内部エラー |
データが定義とマッチしない | datatypeLibrary関数 | 301100 | バイトのアライメントが不適切 |
データが定義とマッチしない | datatypeLibrary関数 | 301102 | データが定義されたパターンとマッチしない |
データが定義とマッチしない | datatypeLibrary関数 | 301105 | データの型が定義とマッチしない |
データが定義とマッチしない | datatypeLibrary関数 | 301172 | バッファの読み込み開始位置が不適切 |
データが定義とマッチしない | decode・encode関数 | 301200 | バイトのアライメントが不適切 |
データが定義とマッチしない | 生成ソースコード | 301300 | bit長が不適切 |
2.3 エラーメッセージの多言語対応
多言語対応を実現するため、日本語メッセージと英語メッセージを 各国言語用プロパティファイルに用意します。 ファイルには、次のようにエラーコードとエラーメッセージを記述します。 メッセージの取得は、エラーコードをキーに行います。
エラーコード=エラーメッセージ
各国言語用メッセージファイルは、次のようになります。 これらのファイルは、各プログラミング言語共通で使用します。
言語 | ファイル名 | ファイルの記述 |
---|---|---|
日本語 | UMSException_jp.properties |
101101=コンテナのlengthに指定されたビット長(bitlen)がencodeに 指定されたデータ型の固定ビット長(typelen)と等しくありません。 コンテナのlengthに指定した値を修正してください。 101103=コンテナのlengthに指定されたビット長(bitlen)がデータ型の 最大ビット長(maxlen)を超えています。 コンテナのlengthに指定した値を修正するか、データ型を変えてください。 : |
英語 | UMSException_en.properties |
101101=It is not equal to fixed bit length (typelen) of the data type from which bit length (bitlen) specified for length of the container is specified for encode. Please correct the value specified for length of the container. 101103=Bit length (bitlen) specified for length of the container exceeds maximum bit length (maxlen)of the data type. Please correct the value specified for length of the container or change the data type. : |
[参照ファイル]
lang/UMSException_en_US.properties
lang/UMSException_ja_JP.properties