Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用try、catch和finally时,并非所有代码路径都返回值_C#_.net - Fatal编程技术网

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

C# 使用try、catch和finally时,并非所有代码路径都返回值,c#,.net,C#,.net,当我执行以下函数时,我得到一个错误: catch (Exception ex) { MessageBox.Show("An exception has occured. Please check the Excel sheet for more info" + ex); return -1; } “错误'Excel1.WebServiceFunctions.CreateMyTask()': 并非所有代码路径都返回值 我的代码: public int CreateMyTask()

当我执行以下函数时,我得到一个错误:

catch (Exception ex)
{
    MessageBox.Show("An exception has occured. Please check the Excel sheet for more info" + ex);
    return -1;
}
“错误'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();
    }
}

你知道我该怎么做吗?我在谷歌上搜索了一下,但我无法准确地找到原因

考虑一下这个场景

try块中返回行之前的代码行中发生错误。然后它将进入catch show messagebox,然后进入finally,然后返回必须返回的内容,因为方法返回类型为int

解决方案

这样做

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

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

在catch部分编写一个
返回-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;
}

如果代码中有错误,它将跳转到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;
}

当出现问题时,需要返回一个
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.
        }
catch(异常示例)
{
MessageBox.Show(“发生异常,请查看Excel工作表了解更多信息”+ex);

return someDefautOrErrorValue;//问题很简单-并非所有代码路径都会导致返回。例如,如果try子句中的Console.WriteLine出现错误,则不会返回任何内容,因为try子句在发现错误后立即结束,并在捕获时继续

要解决此问题,您可以在catch{}子句中添加一个返回,以便在出现错误时发送返回:

catch (Exception ex)
{
    MessageBox.Show("An exception has occured. Please check the Excel sheet for more info" + ex);
    return -1;
}
实际上,您可以对错误使用任何返回值。约定使用-1,因为您通常不会从main子句中获得该返回值

或者,您可以在finally/outsight子句中为两者添加返回值,因为所有对代码的调用都将返回一个值

希望有帮助!

消息“并非所有代码路径都返回值”非常清楚:您声明了返回某个内容的方法,因此通过代码的所有可能路径都应以适当值的
返回结束。除了一个异常(nu pun意为):代码路径也可以以异常结束

通过代码的一条路径是没有任何异常的路径。然后代码进入
try
块中的最后一条语句,这是
返回
-好


如果发生异常,现在该怎么办?控件传递到
catch
块,但没有返回任何内容!这是编译器抱怨的问题。因此,抛出异常或返回“something”。请注意,“something”应该告诉此方法的调用方“出了问题”".

finally
块中添加
return 0;
并查看它是否有效。如果出现异常,您希望返回什么?@MatthewRz控件不能离开finally子句的主体。如果我将return 0放入,则会出现此错误;如果出现异常,将执行
catch
处理程序,然后执行
finally
块a然后…?您在
catch
块中或
try/catch/finally
构造之外缺少另一个
return
语句。@MatthewRz如果从finally块返回值0,那么它将覆盖方法的实际返回值。根据
m_taskID
声明的位置和方式,您的代码m我给出了几种编译时错误。为了清楚起见,我只是更新了它。OP没有显示它最初声明的位置,所以我不知道如何处理它。IMO这比有两个返回语句(在
try
catch
块的末尾)更难读