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 块中返回行之前的代码行中发生错误。然后它会进入 catch show messagebox 然后进入 finally 然后返回什么??????它必须返回一些东西,因为方法返回类型是 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 放在 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在你可以从调用方法中捕获的捕获部分中写一个。

于 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以适当值的 a 结尾。有一个例外(双关语):代码路径也可以以异常结束。

一条通过代码的路径是没有任何例外的路径。然后代码到达try块中的最后一条语句,这return很好。

现在如果发生异常怎么办?控制权传递给catch块并且没有返回任何东西!这就是编译器所抱怨的。所以要么抛出异常,要么返回“某物”。请注意,“某事”应该告诉此方法的调用者“出了问题”。

于 2012-06-21T11:44:50.963 回答
0

问题很简单——并非所有代码路径都会导致返回。例如,如果在 try 子句中的 Console.WriteLine 中出现错误,则不会返回任何内容,因为一旦发现错误,try 子句就会结束,并在 catch 处继续。

为了解决这个问题,您可以在 catch{} 子句中添加一个 return,这样如果出现错误就会发送一个 return:

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 回答