0

我有这样的代码:

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'”

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

4

5 回答 5

3

用新表或空预分配它;

OracleDataTable dt = null;

或者

var dt = new OracleDataTable();

进而:

try
{
    ...
}
catch
{
    ...
}

return dt; // Will return null.

如果为它分配一个新表,它会在出现异常时返回一个空表。

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

于 2012-05-15T20:42:00.943 回答
2

我只是重新抛出异常:

} catch (OracleException e) {
    log.Error(e, e);
    throw;
}

通常最好让异常冒泡,因为仅仅记录异常就足以让异常真正被“处理”(并允许程序流程愉快地继续而没有任何问题)是不太可能的。

于 2012-05-15T20:42:30.740 回答
1

只需将其设置为一个新表,然后在finally执行时将其返回到块中,无论是否引发异常。

OracleDataTable dt = new OracleDataTable();

try
{
    //your code
}
catch (OracleException ex)
{
    //your code
}
finally
{
    return dt;
}
于 2012-05-15T20:44:00.020 回答
1

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

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,并且在发生异常时,您将在堆栈中将其记录一次,并包含所有上下文信息。

于 2012-05-15T21:03:05.087 回答
1

编译器在抱怨“并非所有代码路径都返回值”方面显然是正确的。非void方法需要(a)返回一个值,或者(b)抛出一个异常。

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

如果出现错误情况,您的方法应该返回什么?

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

  • 它应该返回null吗?

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

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

    然后return new OracleDataTable();catch块内。

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

    然后throw;在你记录后重新捕获块内的异常。

(这可能有助于清楚地定义您的方法的合同,例如考虑您的方法对调用代码做出什么样的保证。)

于 2012-05-15T21:07:50.730 回答