ユーザのためのエラーメッセージ・開発者のためのデバッグメッセージ 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 { ... } } 以上