Format Error Bug事件
今天的事件
發生在訂單系統
建立訂閱制的合約時
顯示參數Format Error
BaseContractSn的值為0
奇怪的是支付系統的API
Log顯示有帶入值
然而合約系統卻說值小於等於0
原本以為是錯誤訊息複製貼上沒改到
A欄位為空,卻顯示B欄位沒值
暴力搜尋了一下專案
這個錯誤訊息
還真的是BaseContractSn小於等於0
因為是Http Post
nginx log、IIS log都不會記錄body內容
只好在controller第一行
把參數用log記錄下來
上到Pre環境測試一次
接著就是打開Postman
根據支付系統的參數
再打一次合約系統的API
果不其然
又顯示BaseContractSn為空
查看剛剛埋的Log
其他參數都正常
唯獨BaseContract顯示0
但Postman是有帶入值的
想到這個月是農曆鬼月
不由得背脊發涼
公司普渡我也有參加
不應該有問題才對
看了一下最近的git改動
也和這個API無關
但出現了一個熟悉的關鍵字
BaseContractSn
不過是加在另一個物件上面
這時我才回頭去看Controller的Request物件
BaseContractSn這個欄位
跳綠色小毛毛蟲警告
會隱藏繼承的成員,請使用new關鍵字
再看一下繼承關係
父類別的BaseContractSn是int?
子類別的BaseContractSn是int
這次的改動是父類別
沒有發現子類別已經宣告過相同的欄位
所以就炸開了
解決方式也很簡單
確認父類別的欄位可以改為int
就把子類別的欄位砍掉即可
後記
為了寫這篇網誌
嘗試在自己家的電腦重現這個Bug
沒想到卻是困難重重
不管是.net framework或是.net core
request接收到的
都會是子類別的型別
推測是公司自己刻了底層框架
在reflection的時候做了特殊處理
才會和一般的框架結果不一樣
簡單來說
就是要各種天時地利人和
才能觸發這個Bug
下回預告
開發一個新功能
只有開發者的電腦不work
其他人都正常
難得一見的反工程師Bug
下一回
MenuBar消失 Bug事件