星期二, 10月 14, 2014

該當機的時候就要當機, 不要送 trace


開發者(Developer) 會經常使用 error trace來處理一些錯誤發生的情形, 例如


boolean bar(void) {
   if (fs_file_write(...) != OK) {      
       OS_TRACE_ERROR(“write file fail”);                          
      return false;                           
   }
}


void foo(void) {
   if (bar()== false) {
       /*error recovery */
   }
}

這樣子的寫法是合理的,
因為寫檔失敗這件事情是可能發生的,
說不定是 file system 滿了,
本來就不能寫.
接受 error code 的 foo function 可以做 error recovery 的動作,
例如: 刪除站存檔或是提醒使用者應該要刪除檔案了.

但是有些錯誤是不能接受的, 例如
  if (os_send_msg(hMMIcomm,pMsg) < 0 ) {      
       XPI_OS_TRACE_ERROR(“sendmessage fail”);   
      return false;                           
  }


當我們假設hMMIcomm 是正確的,
但是卻不能送 message  給 MMItask 時,
表示系統發生嚴重的問題,
hMMIcomm 有可能被寫壞了,
此時送出 error trace 於事無補,
因為接受 error code 的 function 也不能處理.


此時最好的處理是讓系統當掉,
發出 exception report.


下面這段程式會在檢查失敗時, 當機然後印出hMMIcomm 的值.
ret = os_send_msg(hMMIcomm,pMsg);
OS_CHECK(ret == OK, hMMIcomm, 0, 0);

這樣的處理方式就是所謂的 Software Exception,
好處是讓developer或是測試人員可以即早接近案發現場.
找到正確產生問題的步驟.

沒有留言: