ユーザのためのエラーメッセージ・開発者のためのデバッグメッセージ
20050809 -MT-
20050825 -MT-
20050831 -MT-
20050902 -MT-
+ ユーザのためのエラーメッセージ
- spos
- 入力データ
- スキーマ行番号(XALAN 調査)
- スキーマ要素番号
- スキーマ要素名(path)
+ 開発者のためのデバッグメッセージ
- inner loop の先頭での出力
- cpos
- num_alive
- brStack の内容
- remove()
- brunch()
- awake()
- sync()
-------------------------------------------------------------------------------
【C言語版】
+ 例外情報の保持
- umsThreadMng.h
typedef struct ums__thread_tbl_t {
int num_alive;
int currentThreadNumber;
int firstFreeThreadNumber;
int firstUsedThreadNumber;
ums__dat_t *dat_array;
ums__state_t *currentState; /* 追加 */
int spos; /* 追加 */
int path; /* 追加 */
int elementNo; /* 追加 */
} ums__thread_tbl_t;
- umsException.h
typedef struct ums__state_t {
int state;
int ums__errno;
char *filename[UMS__STACKTRACE_NUM];
int fileline[UMS__STACKTRACE_NUM];
const char *funcname[UMS__STACKTRACE_NUM];
char detail[UMS__ERR_STRING_SIZE];
int index;
int spos; /* 追加 */
char path[256]; /* 追加 */
int elementNo; /* 追加 */
} ums__state_t;
+ どこまで処理できたかという情報
- 生成ソースコード中に随時
updataValid( ums__num__alive, dat.spos, "", );
+ 例外検出時
- データタイプライブラリの処理 <- データタイプライブラリで例外を検出した場合
sprintf( ums__detail, "%s", value );
throw( UMS__XXX_ERROR, state, ums__detail );
- 生成ソースコードの処理
if ( state->state != OK ) {
state->spos = thread_tbl->spos;
state->elementNo = thread_tbl->elementNo;
state->path = thread_tbl->path;
ums__thread_tbl->currentState = state;
remove();
}
- isFinished() の処理
if ( num__alive == 0 ) {
if ( tbl->state == NULL ) { <- 制御構造の例外を検出した場合
sprintf( ums__detail, "num_alive = %d", num_alive );
state->spos = thread_tbl->spos;
throwWithValue( UMS__NOMATCH_ERROR, state, 0, ums__detail );
} else { <- データタイプライブラリで例外を検出した場合
catchAndThrowWithValue( state, 0 )
}
}
【Java 版】
+ 例外情報の保持
- UMSThreadMng.java
public class UMSThreadMng {
public int num_alive;
public UMSDat list_of_state;
public UMSDat current_dat;
public UMSException currentState; /* 追加 */
public int spos; /* 追加 */
public String path; /* 追加 */
public int elementNo; /* 追加 */
...
}
- UMSException.java
public class UMSException extends Exception {
private int errno;
private String detail;
private int spos;
private String path;
private int elementNo;
...
}
+ どこまで処理できたかという情報
- 生成ソースコード中に随時
updataValid( ums__num__alive, dat.spos, "", );
+ 例外検出時
- データタイプライブラリの処理 <- データタイプライブラリで例外を検出した場合
String detail = "xxx";
throw new UMSException( UMSErrorCode.UMS__XXX_ERROR, detail );
- 生成ソースコードの処理
catch ( UMSException ex ) {
ex.setSpos( ums__thread_tbl.spos );
ex.setElementNo( ums__thread_tbl.spos );
ex.setPath( ums__thread_tbl.spos );
ums__thread_tbl.currentState = ex;
remove();
}
- isFinished() の処理
if ( num__alive == 0 ) {
if ( tbl->currentState == null ) { <- 制御構造の例外を検出した場合
String detail = "xxx";
UMSException ex
= new UMSException( UMSErrorCode.UMS__XXX_ERROR, detail );
ex.setSpos( tbl.spos );
ex.setElementNo( tbl.elementNo );
ex.setPath( tbl.path );
throw ex;
} else { <- データタイプライブラリで例外を検出した場合
throw tbl.currentState;
}
}
-------------------------------------------------------------------------------
+ よりスマートに例外を処理する方法(未実装)
- 受け取った例外を、ラップし、throw する。
1. umsCodeGenerator で扱う Exception は、UMSException とする。
2. ライブラリで検出した例外は、UMSException にくるんで、送出する。
StackException ex = new StackException( xxx, xxx );
throw new UMSException( ex );
3. 受け取った側は、どういう内容の Exception であるかを調べ、それぞれに
応じた処理を行う。
catch ( UMSException ex ) {
if ( ex == null ) {
...
} else if ( ex instanceof StackException ) {
...
} else {
...
}
}
以上