C#并非所有代码路径都返回值try catch

C#并非所有代码路径都返回值try catch,c#,C#,我很难想出如何用下面的代码绕过这个错误。在下面的示例中,我希望将catch中的datatable返回为null public static DataTable DTTable(string mysqlQuery, out DataTable DTTableTable) { try { MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, Connec

我很难想出如何用下面的代码绕过这个错误。在下面的示例中,我希望将catch中的datatable返回为null

    public static DataTable DTTable(string mysqlQuery, out DataTable DTTableTable)
    {
        try
        {
            MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, Connection);
            DataDTTables.SelectCommand.CommandTimeout = 240000;
            DataTable DataDTTablesDT = new DataTable();
            DataDTTables.Fill(DataDTTablesDT);
            DTTableTable = DataDTTablesDT;
            EventLog.WriteEntry(StaticStringClass.crawlerID, "Returning Sucessful datatable query:  "+mysqlQuery);
            return DTTableTable;

        }
        catch (Exception ex)
        {

            string messageString = "Could not fill database for query:  " + mysqlQuery + " because of error:  " + ex.Message.ToString();
            LoggingClass.GenericLogging(messageString);
        }

    }

catch
块完成执行后,不会返回任何内容

对于这种情况,您需要返回一些
DataTable

public static DataTable DTTable(string mysqlQuery, out DataTable DTTableTable)
{
    DataTable result;
    try
    {
        MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, Connection);
        DataDTTables.SelectCommand.CommandTimeout = 240000;
        DataTable DataDTTablesDT = new DataTable();
        DataDTTables.Fill(DataDTTablesDT);
        DTTableTable = DataDTTablesDT;
        EventLog.WriteEntry(StaticStringClass.crawlerID, "Returning Sucessful datatable query:  "+mysqlQuery);
        result = DTTableTable;

    }
    catch (Exception ex)
    {
        string messageString = "Could not fill database for query:  " + mysqlQuery + " because of error:  " + ex.Message.ToString();
        LoggingClass.GenericLogging(messageString);
        result = null;
    }
    return result; //<--- executes even if an exception is thrown
}
publicstaticdatatable DTTable(字符串mysqlQuery,out DataTable DTTable)
{
数据表结果;
尝试
{
MySqlDataAdapter DataDTTables=新的MySqlDataAdapter(mysqlQuery,Connection);
DataDTTables.SelectCommand.CommandTimeout=240000;
DataTable DataDTTablesDT=新DataTable();
DataDTTables.Fill(DataDTTablesDT);
DTTableTable=DataDTTablesDT;
WriteEntry(StaticStringClass.crawleId,“返回成功的数据表查询:”+mysqlQuery);
结果=DTTable;
}
捕获(例外情况除外)
{
string messageString=“由于错误:”+ex.Message.ToString(),无法为查询“+mysqlQuery+”填充数据库;
LoggingClass.GenericLogging(messageString);
结果=空;
}

返回结果;//在catch块中,添加一个返回:

catch (Exception ex)
{
    // your code
    return null;
 }
试一试

编辑:

版本1(没有out参数,因为它是冗余的):

public static DataTable DTTable(string mysqlQuery)
    {
    DataTable Result = null;
    try
    {
    MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, Connection);
    DataDTTables.SelectCommand.CommandTimeout = 240000;
    DataTable DataDTTablesDT = new DataTable();
    DataDTTables.Fill(DataDTTablesDT);
    EventLog.WriteEntry(StaticStringClass.crawlerID, "Returning Sucessful datatable query:  "+mysqlQuery);
    Result =  DataDTTablesDT;
    }
    catch (Exception ex)
    {
    string messageString = "Could not fill database for query:  " + mysqlQuery + " because of error:  " + ex.Message.ToString();
    LoggingClass.GenericLogging(messageString);
    }
public static void DTTable(string mysqlQuery, out DataTable DTTableTable)
    {
    DTTableTable = null;
    try
    {
    MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, Connection);
    DataDTTables.SelectCommand.CommandTimeout = 240000;
    DataTable DataDTTablesDT = new DataTable();
    DataDTTables.Fill(DataDTTablesDT);
    EventLog.WriteEntry(StaticStringClass.crawlerID, "Returning Sucessful datatable query:  "+mysqlQuery);
    DTTableTable = DataDTTablesDT;
    }
    catch (Exception ex)
    {
    string messageString = "Could not fill database for query:  " + mysqlQuery + " because of error:  " + ex.Message.ToString();
    LoggingClass.GenericLogging(messageString);
    }
}
返回结果; }

版本2-不返回值(仅输出参数):

public static DataTable DTTable(string mysqlQuery)
    {
    DataTable Result = null;
    try
    {
    MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, Connection);
    DataDTTables.SelectCommand.CommandTimeout = 240000;
    DataTable DataDTTablesDT = new DataTable();
    DataDTTables.Fill(DataDTTablesDT);
    EventLog.WriteEntry(StaticStringClass.crawlerID, "Returning Sucessful datatable query:  "+mysqlQuery);
    Result =  DataDTTablesDT;
    }
    catch (Exception ex)
    {
    string messageString = "Could not fill database for query:  " + mysqlQuery + " because of error:  " + ex.Message.ToString();
    LoggingClass.GenericLogging(messageString);
    }
public static void DTTable(string mysqlQuery, out DataTable DTTableTable)
    {
    DTTableTable = null;
    try
    {
    MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, Connection);
    DataDTTables.SelectCommand.CommandTimeout = 240000;
    DataTable DataDTTablesDT = new DataTable();
    DataDTTables.Fill(DataDTTablesDT);
    EventLog.WriteEntry(StaticStringClass.crawlerID, "Returning Sucessful datatable query:  "+mysqlQuery);
    DTTableTable = DataDTTablesDT;
    }
    catch (Exception ex)
    {
    string messageString = "Could not fill database for query:  " + mysqlQuery + " because of error:  " + ex.Message.ToString();
    LoggingClass.GenericLogging(messageString);
    }
}

因为可选的代码路径是
catch
块,并且您没有重新抛出异常,所以仍然需要返回
null
数据表

您可以在
catch
块中或紧跟其后执行此操作


我还想说,
DTTable
方法中的
out DataTable DTTable
参数是多余的和不必要的。

如果要在catch内返回null,那么只需在catch内返回null即可:

    catch (Exception ex)
    {
        string messageString = "Could not fill database for query:  " + mysqlQuery + " because of error:  " + ex.Message.ToString();
        LoggingClass.GenericLogging(messageString);
        return null;
    }

将简单的return语句设置为null值。我希望这能解决您的问题。

没什么大不了的,但我建议将局部变量更改为始终以小写字母开头,即使您打算从函数返回它们。这样就更容易判断它们是局部变量。例如,您已经在使用
messageString
执行此操作。返回
out
参数非常愚蠢,没有冒犯的意思。为什么会有这样的设计?可以将其作为返回值,也可以作为输出参数。严格来说,它不必在catch块完成之后。OP也可以返回到catch块内部(可能在它的末尾)。当然,您的代码也正确地解决了这个问题(正如您在这里所写的,我更喜欢单返回样式)。