エラー処理の目的 • 開発時 – 開発者にエラーが発生した場所やそのときの 状況を知らせて、修正を促すため。 • リリース後 – 正常な処理が続けられなくなったことを通知し て、可能であればデータを保存する機会を提 供するため。 望む結果 • • • • • エラーの発生場所や発生状況がわかる。 エラーが発生したコンテキストがわかる。 エラーコードが体系的に管理できている。 エラーの原因を推測しやすい。 エラーのログが記録され、後で確認できる。 選択肢 • エラーコードを定義する場所 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);
© Copyright 2024 ExpyDoc