为什么这段代码看起来并不总是返回一个值?

时间:2013-09-13 22:24:53

标签: c# barcode

关于这个问题:How to convert UPC-E to UPC-A?,我发现并改编了一种将UPC-E条形码转换为UPC-A的方法:

public static string ConvertUPCEToUPCA(string UPCE)
{
    try
    {
        int UPCLen;
        string UPCA = "";
        int chkInt;

        UPCLen = UPCE.Length; 
        FormatString formatString = new FormatString();
        if (formatString.containsAlpha(UPCE) != -1) 
        {
            UPCLen = 11;
        }

        if (UPCLen == 7) // Didn't enter a check digit
        {
            UPCE = UPCE.Substring(1,6);
        }
        else if (UPCLen == 8) // Entered both check digit and leading 0 digit
        {
            UPCE = UPCE.Substring(2,6);
        }

        if (UPCLen < 9)
        {
            chkInt = Convert.ToInt32(UPCE.Substring(5,1));

            switch (chkInt)
            {
                case 0: 
                case 1: 
                case 2:
                    UPCA = UPCE.Substring(0,2) + UPCE.Substring(5,1) + "0000" + UPCE.Substring(2,3);
                    break;
                case 3:
                    UPCA = UPCE.Substring(0,3) + "00000" + UPCE.Substring(3,2);
                    break;
                case 4:
                    UPCA = UPCE.Substring(0,4) + "00000" + UPCE.Substring(4,1);
                    break;
                case 5:
                case 6:
                case 7:
                case 8:
                case 9:
                    UPCA = UPCE.Substring(0,5) + "0000" + UPCE.Substring(5,1);
                    break;
                default:
                    break;
            }
            UPCA = "0" + UPCA;
        }
        return UPCA;
    }
    catch(Exception ex)
    {
        Duckbill.ExceptionHandler(ex, "PlatypusUtils.ConvertUPCEToUPCA(UPCE)");
    }
}

...但我得到了,“并非所有代码路径都返回一个值。”为什么?不是“归还UPCA”;无论怎么回事?

2 个答案:

答案 0 :(得分:4)

如果发生异常,你不会返回任何内容。想一想:你已经找到了Exception并且你已经处理过了。怎么办?调用者期望从您的方法返回一些,并且您的方法不会放弃任何。

你应该:

  • catch块中返回一个字符串;
  • Exception区块中投掷catch - 您抓住的那个或新的;
  • 创建一个存储要返回的值的变量。在<{strong> null块之前为其分配try,空字符串或任何其他“默认”值。作为try块中的最后一项,将结果值分配给此变量。将其返回finally块。因此,如果发生错误,您至少可以返回一些内容。否则,您将返回操作结果。

根据您的要求选择最适合您的选项。您也可以尝试一些变体。

编辑:我刚刚重新阅读了这个问题并特别注意了最后一句话。

  

不是“归还UPCA”;无论怎么回事?

没有。如果某处发生错误,try块将停在违规行。执行直接进入第一个catch块,它可以处理抛出的异常(无论如何只有你的情况)。

答案 1 :(得分:2)

即使代码抛出异常,您也应该总是返回一个值,因为您使用的方法是返回字符串并且不是 void 方法(不返回任何东西)

你应该 Catch 括号之间返回字符串