首頁>技術>

某日中午,收到告警,有一筆訂單下單失敗了。趕緊去Cat看了下錯誤資訊,如下:

Web應用呼叫訂單服務的RPC介面報錯了,一看錯誤很自主的認為這是一個序列化的問題。後面排查下來發現壓根就不是,這個錯誤報的有點。。。

想著是不是引數中有什麼特別的東西,然後發現也沒有什麼特別的。這個錯誤是某個商品下單才會出現,不是所有的商品都會出現這個問題。

然後嘗試在本地復現,有這麼一行關鍵的程式碼,貼了一部分,完整的作用是埋點打日誌。

String.format("UnifiedOrderServiceImpl.makeOrder建立訂單, make order, request: MakeOrderRequest= "+ request)

說實話我是沒看懂這裡用String.format的原因在哪裡,不就是想拼接個字串麼?還搞個format,搞就搞嘛,還沒用佔位符,騷操作。

真正Bug的原因是request物件中有個String型別的欄位,欄位裡面的內容有%\,format內部就報錯了,大家可以用下面這段程式碼復現錯誤:

public static void main(String[] args) {   String.format("dsdsdsd"+"%\\sdsd");}

錯誤資訊:

Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = '\'

原因是在format中會校驗引數,然後觸發了異常。

雖然是很小的改動,就記錄個日誌而已,但也不要輕視,往往就是不夠仔細,然後才會出這種問題。

總結:

認真對待每一行程式碼做好code review

12
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 讓API並行呼叫變得如絲般順滑的絕招