編譯器報錯:not all code paths return a value(並非所有代碼路徑都有返回值)。
InquiryCard 方法包含三層巢狀 if (receivedata[2] == 0x00) 判斷:
缺失:第 1、2 層 if 為 false 時(即失敗情況)**沒有任何返回語句**,導致方法隱式結束無返回值。
public ErrorCode InquiryCard(ref string SerialNo) {
if (!_Active) return ErrorCode.DeviceNoOpen;
try {
// ... 發送尋卡命令 ...
byte[] receivedata = GetPortStream(7);
if (receivedata[2] == 0x00) { // 尋卡成功
// ... 發送獲取卡號命令 ...
byte[] receivedata1 = GetPortStream(9);
if (receivedata1[2] == 0x00) { // 獲取卡號成功
// ... 解析卡號 ...
// ... 發送選中卡命令 ...
byte[] receivedata2 = GetPortStream(6);
if (receivedata2[2] == 0x00) { // 選中卡成功
return ErrorCode.Success;
}
return ErrorCode.SelectCardFailed; // ← 新增:選中卡失敗
}
return ErrorCode.GetCardNumberFailed; // ← 新增:獲取卡號失敗
}
else if (receivedata[2] == 0xFF) {
return ErrorCode.CardNotFound; // 尋卡無卡
}
else {
return ErrorCode.PacketLoss; // 協議異常
}
}
catch (Exception ex) {
// 記錄日誌 ex.ToString()
return ErrorCode.Abnormal;
}
}
ErrorCode(如 SelectCardFailed),便於上層精確處理。_SerialPort 在異常時正確關閉,建議實作 IDisposable。_SerialPort 驗證各分支返回碼正確。**每一條 `if` 分支都必須有對應的 `return` 或 `throw`**。巢狀條件越深,遺漏風險越高。重構為扁平結構並補全錯誤碼,是解決此類問題的標準化路徑。