为什么else分支没有被执行

本文关键字:执行 else 分支 为什么 | 更新日期: 2023-09-27 18:17:16

这实际上是一个工作应用程序。尽管没有太多的错误捕获方式。

我只是想记录流程,没有到达If分支或else分支。我该怎么做才能实现呢?分支的两边都没有登录到我的txt文件。

while (reader.Read())
{
    if (reader.HasRows)
    {
        LogMessage("Further Inside Try2 ");
        byte[] paymentData = (byte[])reader["payment"];
        strPaymentData = ASCIIEncoding.Unicode.GetString(paymentData);
        LogMessage(strPaymentData + " strPaymentData");
    }
    else
    {
        LogMessage("Payment Retrievlal Failed ");
    }
}

为什么else分支没有被执行

如果使用while reader.read(),则不需要检查reader是否有行。如果reader没有返回任何行,While循环将不会执行。因此,如果reader没有行,则永远不会到达else。

你可以这样重写你的代码:

if (reader.HasRows)
{
    while (reader.Read())
    {    
        LogMessage("Further Inside Try2 ");
        byte[] paymentData = (byte[])reader["payment"];
        strPaymentData = ASCIIEncoding.Unicode.GetString(paymentData);
        LogMessage(strPaymentData + " strPaymentData");
    }
}
else
{
    LogMessage("Payment Retrievlal Failed ");
}

如果没有行可读,则reader.Read()返回false。因此,如果您想对没有返回的行进行特殊处理,则需要将该检查移到while:

之外。
    if (reader.HasRows())
    {
        while (reader.Read())
        {
            LogMessage("Further Inside Try2 ");
            byte[] paymentData = (byte[])reader["payment"];
            strPaymentData = ASCIIEncoding.Unicode.GetString(paymentData);
            LogMessage(strPaymentData + " strPaymentData");
        }
    }
    else
    {
        LogMessage("Payment Retrievlal Failed ");
    }

现在,如果您知道只有最多返回1行(就像读取主键一样),您可以简化代码,只需将reader.Read()放在if中:

if (reader.Read())
{
    LogMessage("Further Inside Try2 ");
    byte[] paymentData = (byte[])reader["payment"];
    strPaymentData = ASCIIEncoding.Unicode.GetString(paymentData);
    LogMessage(strPaymentData + " strPaymentData");
}
else
{
    LogMessage("Payment Retrievlal Failed ");
}

如果刚刚成功读取了一行,那么显然至少有1行,因此HasRows将返回true。将HasRows测试移到之外的while

如果您没有到达两个分支中的任何一个,那么一定是因为reader.Read())返回false

很可能您的reader.Read()调用发现没有行,因为文件由于某种原因未打开或为空。因此,在读取后检查新的HasRows不会像您期望的那样工作。

反向逻辑:

if (reader.HasRows)
{
  while (reader.Read())
  {
     //Process a row
  }
else
{
     LogMessage("Payment Retrievlal Failed "); 
}