C#并非所有代码路径都返回值try catch
我很难想出如何用下面的代码绕过这个错误。在下面的示例中,我希望将catch中的datatable返回为nullC#并非所有代码路径都返回值try catch,c#,C#,我很难想出如何用下面的代码绕过这个错误。在下面的示例中,我希望将catch中的datatable返回为null public static DataTable DTTable(string mysqlQuery, out DataTable DTTableTable) { try { MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, Connec
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块内部(可能在它的末尾)。当然,您的代码也正确地解决了这个问题(正如您在这里所写的,我更喜欢单返回样式)。