如何安抚编译器 re:在 try 块中返回结果

本文关键字:返回 结果 try 何安抚 编译器 re | 更新日期: 2023-09-27 18:34:11

我有这样的代码:

try {
    if (!(oc.State == ConnectionState.Open)) {
        oc.Open();
    }
    query = "SELECT DUCKBILL FROM PLATYPUS";
    da = new OracleDataAdapter();
    oCommand = new OracleCommand(query, oc);
    oCommand.Parameters.Add("ABCid", platypusABCID);
    da.SelectCommand = oCommand;
    dt = new OracleDataTable();
    da.Fill(dt);
    return dt;
} catch (OracleException e) {
    log.Error(e, e);
    //return dt; //use of unassigned local variable 'dt'
}
//return dt; //use of unassigned local variable 'dt'

。这让我停止了"并非所有代码路径都返回值"或(如注释所示("使用未分配的局部变量'dt'">

我可以摆脱尝试..catch,但由于这是一个数据库操作,我希望能够记录任何由此产生的错误消息。我怎样才能保持我的异常处理并安抚抱怨?我知道,这是一个仁慈的抱怨,但仍然...

如何安抚编译器 re:在 try 块中返回结果

用新表或 null 预分配它;

OracleDataTable dt = null;

var dt = new OracleDataTable();

然后:

try
{
    ...
}
catch
{
    ...
}
return dt; // Will return null.

如果为其分配一个新表,它将在发生异常时返回一个空表。

考虑到您的情况,从逻辑上选择您喜欢的那个。

我只是重新抛出异常:

} catch (OracleException e) {
    log.Error(e, e);
    throw;
}
通常最好让异常冒

泡,因为仅记录异常就足以实际"处理"异常(并允许程序流愉快地继续没有任何问题(

不太可能。

只需将其设置为新表,然后将其返回到 finally 块中,因为无论是否抛出异常,都会执行该块。

OracleDataTable dt = new OracleDataTable();
try
{
    //your code
}
catch (OracleException ex)
{
    //your code
}
finally
{
    return dt;
}

我宁愿用异常包装你的数据库异常,这对调用代码更有价值:

try {
    if (!(oc.State == ConnectionState.Open)) {
        oc.Open();
    }
    query = "SELECT DUCKBILL FROM PLATYPUS";
    da = new OracleDataAdapter();
    oCommand = new OracleCommand(query, oc);
    oCommand.Parameters.Add("ABCid", platypusABCID);
    da.SelectCommand = oCommand;
    dt = new OracleDataTable();
    da.Fill(dt);
    return dt;
} catch (OracleException e) {
    throw new MyDataLayerException("Cannot retrieve duckbill", e);   
}

在这种情况下,您的调用代码不会被强制检查 null 的返回值,并且在异常的情况下,您将在堆栈中记录一次它,其中包含所有上下文信息。

编译器在

抱怨"并非所有代码路径都返回值"方面显然是正确的。非void方法需要 (a( 返回值,或 (b( 引发异常。

当数据库操作失败时,您的代码当前既不会这样做:您正在捕获异常,但您既没有将其重新抛出给调用方,也没有从catch块内部返回值。

在出现错误条件的情况下,您的方法应返回什么?

你必须决定这一点。没有人能告诉你正确的答案,因为有很多明智的解决方案。例如:

  • 它应该返回null吗?

    如果是这样,请在记录错误后从catch块内部return null;

  • 它应该返回一个空表吗?

    然后从catch块内部return new OracleDataTable();

  • 或者,也许,它应该什么都不返回?

    然后在记录异常后,在 catch 块中重新throw;异常。

(清楚地定义方法的协定可能会有所帮助,例如,考虑方法对调用代码做出什么样的保证。