今天上午一位同事的程序遇到一個問題,說是加了很少的一點代碼之後,昨天咝械暮煤玫某绦蚩偸菆箦e,又無法找到錯誤在哪裡,花了他一上午,搞的他很鬱悶,代碼具體是這樣的:

  1. NRole = add_honor_timer(NRole), 
  2. case lists:member(HonorId, ?add_and_use_honors) of 
  3.     true -> 
  4.         case use_honor(HonorId, NRole) of 
  5.             {ok, NewRole} ->  
  6.                 role:pack_send(Pid, 13001, honors(NewRole)), 
  7.                 {ok, NewRole}; 
  8.             _ -> {ok, NRole} 
  9.         end
  10.     false -> 
  11.         {ok, NRole} 
  12. end

他增加的代碼沒在這裡顯示出來,很小的一段,打印出來的錯誤提示顯示是第6行出錯

  1. {'EXIT',{{badmatch......line 6}}} 

他就一個人在那裡糾結不停的找這行,發現裡面的邏輯沒問題,很ok,後來實在找不到為什麼回報出第6行的badmatch,叫我就過去看看,一看badmatch錯誤,第6行一直咝械暮煤玫模隙ㄊ菙祿Y構改變了,哪裡匹配不上去了,往上一看,原來這位同學敲代碼的時候敲錯誤,第一行明顯左邊和右邊匹配不上(右邊有改變這個數據),這裡才是badmatch的錯誤,應該從新用個變量就好了:

  1. NRole1 = add_honor_timer(NRole), 

下面的代碼也用新變量就解決了這個問題,現在回過頭來,至於為什麼錯誤位置提示不准確的問題,應該是他只是動態更新了代碼,錯誤記錄的行數還是原來的位置,我提意見他重啟下应用程序,錯誤記錄的位置肯定就對了,果然,重啟之後,提示他原來的代碼第1行犯了badmatch錯誤。

通過這個問題可以看出來,越是有了一定經驗的開發人員,在他失誤的時候,犯的錯誤越低級,越是語法層面的,他自己就越是不易發現,因為從心裡覺得,我不可能犯這種基本的語法錯誤,都往邏輯方面去排了,導致自己折騰自己。這就是開發過程中矛盾,時刻要謹慎,警惕自己。不要把問題想的太複雜太高端了,淡定一些。