【问题标题】: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;

你能解释一下这个陈述中的错误是什么,你会怎么做才能避免这样做......

【问题讨论】:

    标签: plsql


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-19
      • 2012-08-29
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多