PL/SQL 中的“When Others Then Null”有啥不好?
Posted
技术标签:
【中文标题】PL/SQL 中的“When Others Then Null”有啥不好?【英文标题】:What is bad in "When Others Then Null" in PL/SQL?PL/SQL 中的“When Others Then Null”有什么不好? 【发布时间】:2009-09-17 12:00:41 【问题描述】:我刚刚阅读了this question,一个解决方案指出:
你不知道你得到的事实 NO_DATA_FOUND 异常表明 你已经成为最大的之一 PL/SQL 开发人员曾经犯过的错误:
EXCEPTION -- Never do this in real code!!! WHEN OTHERS THEN NULL; END;
你能解释一下这个陈述中的错误是什么,你会怎么做才能避免这样做......
【问题讨论】:
【参考方案1】:问题是,您正在捕获所有异常,然后忽略它们。你永远不会知道什么时候出了问题。
【讨论】:
你的意思是这里的坏习惯不是使用“When Others Then Null”,而是仅使用它,即之前没有捕获任何其他异常? 不,使用它很糟糕。至少,您的 when others 子句应该在某处记录异常。但很可能您应该记录并引发异常 @Matthew:我不同意。在许多完全有效的场景中,您希望捕获所有异常并忽略它们。是否记录它们取决于您。我确实同意十分之九的时候你会想要做某种日志记录,但是如果我在一个经常使用的低级 API 中做某种尽力而为的代码,那么我可能会跳过日志记录的开销. @darreljnz:然后有一天你会为某事失败的原因而摸不着头脑,然后去添加调试代码,或者运行调试器以找到失败的地方。可能有非常有限的情况,但我怀疑它更像 999/1000 而不是 9/10。 底线:如果你不关心进程是否失败,那么你就不会关心进程是否成功 - 那么为什么首先要浪费资源 - 完全删除代码。 【参考方案2】:例如,如果您不希望 pl/sql 块的异常进一步传播,那么这段 sn-p 代码没有任何问题。如果您是故意这样做的,那不是错误的代码或错误。这就是 pl/sql 中的全部内容。并且在代码中可能存在嵌套 BEGIN/EXCEPTION/END 块的情况,并且可能不希望事务在特定代码横截面失败时失败。如果您出于任何原因/要求故意这样做,您就不能说它是糟糕的编码。
BEGIN
--something important here
--something even more important here
BEGIN
--something secondary goes here but not important enough to stop the process or
--log a message about it either
--maybe send an informative email to the support group or
--insert a log message when debugging the process or
--the list could go on and on here
EXCEPTION
--I don't care if this block fails, absorbing all errors regardless of type
WHEN OTHERS THEN NULL;
END;
-- something super important here, must happen
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- do something useful for this exception
WHEN OTHERS THEN
-- do something by default if we don't expect this error
END;
【讨论】:
在实践中很少会不关心任何可能的异常。 99.9% 的when others then null
代码是当有人想忽略一个特定错误但又懒得正确捕获它时。【参考方案3】:
编码总是很糟糕。如果你故意这样做,你可以说这是糟糕的编码。事实上,如果你故意这样做,那是很糟糕的代码,因为它表明你对你完全忽略的所有错误知之甚少。
http://stevenfeuersteinonplsql.blogspot.com/2017/02/now-not-to-handle-exceptions.html
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1155066278457
【讨论】:
以上是关于PL/SQL 中的“When Others Then Null”有啥不好?的主要内容,如果未能解决你的问题,请参考以下文章