0

次の関数を実行すると、エラーが発生します。

「エラー 'Excel1.WebServiceFunctions.CreateMyTask()': すべてのコード パスが値を返すわけではありません

私のコード:

public int CreateMyTask()
{
    try
    {
        Console.WriteLine("Invoking CreateTask method");
        Console.WriteLine("-----------------------------------");
        m_taskID = taskClient.CreateTask(m_tInstance);
        Console.WriteLine("Task create successfully:ID=" + m_taskID.ToString());
        Console.WriteLine("-----------------------------------");
        return m_taskID;
    }
    catch (Exception ex)
    {
        MessageBox.Show("An exception has occured. Please check the Excel sheet for more info" + ex);
    }
    finally
    {
        GC.Collect();
    }
}

どうすればこの背後に行くことができるかについて何か考えはありますか? 少しグーグルで調べましたが、正確にゼロにすることはできません

4

8 に答える 8

5

理由

このシナリオを考えてみましょう。

tryブロックの戻り行の前のコード行でエラーが発生します。それからそれはキャッチショーメッセージボックスに入り、そして最後にそしてそれから何を返しますか????? メソッドの戻り型がintであるため、何かを返す必要があります。

解決

これを行う

    finally
    {
        GC.Collect();
    }
    return m_taskID;
}
于 2012-06-21T11:02:23.060 に答える
4

catch ブロックから 0 またはその他の int 値を返すと、これが修正されます。呼び出しメソッドでは、その int 値を例外として理解する必要があります。

于 2012-06-21T11:02:54.227 に答える
2

コードにエラーがある場合、catch ブロックにジャンプし、return にヒットすることはありません。return を try catch ブロックの外に置く必要があります。

public int CreateMyTask()
{
    int value = -1;

    try
    {
        Console.WriteLine("Invoking CreateTask method");
        Console.WriteLine("-----------------------------------");
        m_taskID = taskClient.CreateTask(m_tInstance);
        Console.WriteLine("Task create successfully:ID=" + m_taskID.ToString());
        Console.WriteLine("-----------------------------------");
        value = m_taskID;
    }
    catch (Exception ex)
    {
        MessageBox.Show("An exception has occured. Please check the Excel sheet for more info" + ex);
    }
    finally
    {
        GC.Collect();
    }

    return value;
}
于 2012-06-21T11:04:46.153 に答える
1

return -1呼び出し元のメソッドからキャッチできるキャッチ部分にa を記述します。

于 2012-06-21T11:04:15.873 に答える
1

これは、戻り値を使用して簡単に修正できます。

public int CreateMyTask()
{

    int returnValue = -1;       

    try
    {
        Console.WriteLine("Invoking CreateTask method");
        Console.WriteLine("-----------------------------------");
        m_taskID = taskClient.CreateTask(m_tInstance);
        Console.WriteLine("Task create successfully:ID=" + m_taskID.ToString());
        Console.WriteLine("-----------------------------------");
        returnValue = m_taskID;
    }
    catch (Exception ex)
    {
        MessageBox.Show("An exception has occured. Please check the Excel sheet for more info" + ex);
        returnValue = -1;  // Shouldn't be necessary but the compiler likes it
    }
    finally
    {
        GC.Collect();
    }

    return returnValue;
}
于 2012-06-21T11:04:42.697 に答える
1

問題が発生したときに返す必要がありますint

現在の実装が返されずint、例外がスローされた場合。

catch (Exception ex)
            {
                MessageBox.Show("An exception has occured. Please check the Excel sheet for more info" + ex);
                return someDefautOrErrorValue; // <- add return statement here
            }
            finally
            {
                GC.Collect();   
            }
            return someDefautOrErrorValue; // <- or alternately here.
        }
于 2012-06-21T11:05:35.810 に答える
1

「すべてのコード パスが値を返すわけではない」というメッセージは非常に明確です。何かを返すようにメソッドを宣言したため、コード内のすべての可能なパスreturnは適切な値の で終わる必要があります。例外が 1 つあります (しゃれを意図したものです): コード パスは例外で終了することもあります。

コードの 1 つのパスは、例外のないパスです。次に、コードはtryブロック内の最後のステートメントに到達します。これはreturn問題ありません。

例外が発生した場合はどうなりますか? コントロールがcatchブロックに渡され、何も返されません! それがコンパイラが不平を言うものです。したがって、例外をスローするか、「何か」を返します。その「何か」は、このメソッドの呼び出し元に「何かがうまくいかなかった」ことを伝える必要があることに注意してください。

于 2012-06-21T11:44:50.963 に答える
0

問題は単純明快です。すべてのコード パスがリターンにつながるわけではありません。たとえば、try 句の Console.WriteLine でエラーが発生した場合、エラーが検出されるとすぐに try 句が終了し、catch で続行されるため、何も返されないと考えてください。

この問題を解決するには、エラーが発生した場合にリターンが送信されるように、catch{} 句にリターンを追加します。

catch (Exception ex)
{
    MessageBox.Show("An exception has occured. Please check the Excel sheet for more info" + ex);
    return -1;
}

実際には、エラーに対して任意の戻り値を使用できます。慣例では -1 を使用します。これは、通常、主節からの戻り値として得られないためです。

または、コードへのすべての呼び出しが値を返すため、finally 句または句全体の外側に両方の戻り値を追加できます。

お役に立てば幸いです!

于 2012-06-21T11:05:50.987 に答える