当其他人然后VS.当异常然后

时间:2017-02-28 09:43:13

标签: sql oracle plsql exception-handling

做的好处是什么:

EXCEPTION
WHEN [error code] THEN
     [Handle Exception]
WHEN [error code1] THEN
     [Handle Exception1]
END;

通过这个:

EXCEPTION
WHEN Others THEN
   IF sqlcode=[error code] THEN
     [Handle Exception]
   ELSIF sqlcode=[error code1] THEN
     [Handle Exception1]
   END IF;
END;

我听说在我的第二个例子中使用others的方式是不好的做法,但我不确定为什么。他们都在处理异常,所以问题是什么?

我也听说过我应该将raises放在我的when others语句中,否则可能会从外部代码块中隐藏错误。这是真的?

我是pl / sql的新手,所以如果有任何可以扩展的话,这将非常有帮助。

1 个答案:

答案 0 :(得分:4)

源代码的读取频率高于写入时间。如果您的代码具有表现力且符合标准,则其他人更容易理解(并且"其他人"包括您在六个月内)。

异常块的标准方法是为我们需要处理的特定异常设置单独的WHEN子句,并使用WHEN OTHERS我们是否需要所有其他异常的默认处理程序。在WHEN OTHERS子句下拥有特定异常的代码是不合规的,也是不必要的。

  

"我听说过我应该加注我的其他声明,否则可能会从外部代码块隐藏错误? "

一般来说,是的。继我之前的观点之后,我们应该针对特定的可预见的异常编写明确的处理方法。 WHEN OTHERS子句保留用于其他所有内容,即无法预见的异常,因此我们极不可能编写适用于所有情况的通用处理程序。重新引发异常并允许调用程序决定如何处理它是很重要的。

事实上,同样的观察也经常适用于定义的例外。可以处理和抑制一些异常(例如,有时我们可以使用默认值处理NO_DATA_FOUND)但通常调用程序需要知道发生了异常并且被调用的程序没有遵循预期的路径。

就处理异常而言,重要的是记录尽可能多的信息,包括真实的错误消息和相关的变量或参数。 Error happeneddbms_output.put_line更有用。另外Create PROCEDURE [dbo].[ABC] ( @LocalDateTime datetime = null ) as begin set @LocalDateTime = ISNULL(@LocalDateTime,GETUTCDATE()) end 不记录:在现实生活中我们需要将信息保存到表或文件中,因为PL / SQL程序通常在后台运行,而不是客户端,所以没有输出屏幕至。