如何安抚编译器 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,但由于这是一个数据库操作,我希望能够记录任何由此产生的错误消息。我怎样才能保持我的异常处理并安抚抱怨?我知道,这是一个仁慈的抱怨,但仍然...
用新表或 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;
异常。
(清楚地定义方法的协定可能会有所帮助,例如,考虑方法对调用代码做出什么样的保证。