myGroup > myProject
 

例外処理

例外処理

ここで述べる例外には、以下の2種類があります。

  1. mapping definition からのソースコード生成時の例外
  2. デコード/エンコード処理時の例外

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:<要素名>, "エラーメッセージ"
  詳細情報
   :

Note
例外の詳細情報(マッチしなかった文字列や型などの情報)は、 ユーザーが独自に行う必要があります。

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 では、例外処理機構を用いて例外処理を行います。

設計メモ:JAVA の例外及び clone() に関して

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

Note
デフォルト(環境変数 LANG の設定がない場合)では、英語版プロパティファイルを読み込みます。