エラー処理方針 - mobile robot 開発日記

エラー処理の目的
• 開発時
– 開発者にエラーが発生した場所やそのときの
状況を知らせて、修正を促すため。
• リリース後
– 正常な処理が続けられなくなったことを通知し
て、可能であればデータを保存する機会を提
供するため。
望む結果
•
•
•
•
•
エラーの発生場所や発生状況がわかる。
エラーが発生したコンテキストがわかる。
エラーコードが体系的に管理できている。
エラーの原因を推測しやすい。
エラーのログが記録され、後で確認できる。
選択肢
•
エラーコードを定義する場所
A) 各ヘッダファイル内
B) エラーコードをまとめたヘッダファイル内
•
エラー処理をする場所
A) エラーを見つけた関数内 記録して上位に
エラーコードを
B) 呼び出し元の関数内
返す!
C) タスクの基点となる関数内
呼び出し元にエラーコードを返しても、呼び出し元側で
エラーコードチェックをやらないとそこで報告が止まってしまう。
エラー処理の方針
• ある関数内でエラーを検出したら、
– エラーログにエラー情報を記録して、
– その関数の呼び出し元にエラーコードを返す。
• ユースケースシナリオ内でのエラーは、
– システムコントローラが最終的なエラー処理(ユーザ
への通知)を行う。
• シナリオ外のエラーは、
– 処理の起点となるタスク本体がシステムコントローラ
にエラー捕捉を通知して、
– システムコントローラが最終的なエラー処理(ユーザ
への通知)を行う。
6.エラー表示をする
システム
コントローラ
6.エラーコードを返す
上位の関数
4.エラーコードを返す
上位の関数
ユーザI/F
7.エラー情報を
記録する。
5.エラー情報を記録する。
3.エラー情報を
記録する。
ErrorHandler
2.エラーコードを返す
関数 hoge()
1.エラー情報を記録する。
エラー処理系設計
RAMが少ない/ログに使えるFlashやEEPROMが無い場合、
最低限、RAMにエラーコードだけでも保存する。
typedef struct{
ER errorCode;
char functionName[FNAME_SIZE];
char reason[REASON_SIZE];
} ErrorReport;
typedef struct{
uchar index;
ER
report[ERROR_REPORT_STACK_SIZE];
}ErrorHandler;
void ErrorHandler_setReport(ErrorReport report);
void ErrorHandler_printReport(void);