0

この質問に関連して: UPC-E を 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;」ではありませんか?ラインは何に達しましたか?

4

2 に答える 2

4

例外が発生した場合、何も返されません。考えてみてください。あなたは を捕まえExceptionて対処しました。それで?呼び出し元はメソッドから何らかのリターンを期待していますが、メソッドは何も返していません。

次のいずれかを行う必要があります。

  • catchブロック内の文字列を返します。
  • Exceptionブロックに投げcatchます - あなたが捕まえたもの、または新しいもののいずれかです。
  • 返す値を格納する変数を作成します。ブロックの前にnull空の文字列、またはその他の「デフォルト」値を割り当てます。ブロックの最後に、結果の値をこの変数に割り当てます。ブロックで返します。したがって、エラーが発生した場合、少なくとも何かを返す必要があります。それ以外の場合は、操作の結果を返します。trytryfinally

要件に基づいて、最適なオプションを選択してください。それらのいくつかのバリエーションを試すこともできます。

編集:質問を読み直して、最後の文に特別な注意を払いました。

「返品UPCA;」ではありませんか?ラインは何に達しましたか?

いいえ。どこかでエラーが発生した場合、tryブロックは問題のある行で停止します。実行は、スローされた例外を処理できる最初のブロックに直接進みcatchます(とにかく、あなたのケースには1つしかありません)。

于 2013-09-13T22:34:05.053 に答える
2

コードが例外をスローした場合でも、常に値を返す必要があります。これは、文字列を返し、voidメソッドではない (何も返さない)メソッドを使用しているためです。

Catchブラケットの間の文字列を返す必要があります。

于 2013-09-13T22:32:48.463 に答える