使用try,catch和finally时,并非所有代码路径都返回值

时间:2012-06-21 11:01:06

标签: c# .net

当我执行以下函数时,出现错误:

  

“错误'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();
    }
}

关于我如何能够支持这一点的任何想法?我做了一些谷歌搜索,但我无法完全归零

8 个答案:

答案 0 :(得分:5)

<强>原因

考虑这种情况。

在try块中的返回行之前的代码行中发生错误。然后它将进入catch show messagebox然后在最后然后返回什么?????它必须返回一些原因,方法返回类型是int。

<强>解决方案

这样做

    finally
    {
        GC.Collect();
    }
    return m_taskID;
}

答案 1 :(得分:4)

从catch块返回0或任何其他int值,它将解决此问题。在您的调用方法中,您必须将int值理解为异常。

答案 2 :(得分:2)

如果代码中有错误,它将跳转到catch块并且永远不会返回。您需要将返回值放在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;
}

答案 3 :(得分:1)

在catch部分写一个return -1,你可以从调用方法中找到它。

答案 4 :(得分: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;
}

答案 5 :(得分: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.
        }

答案 6 :(得分:1)

消息“并非所有代码路径都返回一个值”非常清楚:您声明该方法返回一些内容,因此代码中的每个可能路径都应以return的适当值结束。有一个例外(nu pun意图):代码路径也可以以异常结束。

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

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

答案 7 :(得分: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 / outside之外添加两者的返回值,因为所有对代码的调用都将返回一个值。

希望有所帮助!