Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当其他人和例外时_Sql_Oracle_Plsql_Exception Handling - Fatal编程技术网

Sql 当其他人和例外时

Sql 当其他人和例外时,sql,oracle,plsql,exception-handling,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

这样做的好处是什么:

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;
我听说用我在第二个例子中演示的方式使用
其他人是不好的做法,但我不确定为什么。他们都在处理异常,那么问题是什么呢

我还听说,当其他语句出现时,我应该在我的
语句中添加
raises
,否则错误可能会从外部代码块中隐藏。这是真的吗


我对pl/sql非常陌生,因此如果有人能在这一点上进行扩展,那将非常有帮助。

源代码的阅读频率高于编写频率。若你们的代码是有表现力的,并且符合标准,那个么其他人就更容易理解(而“其他人”在六个月内就包括你们)

异常块的标准方法是为我们需要处理的特定异常使用单独的WHEN子句,并在其他异常需要默认处理程序时使用WHEN。当其他条款不符合要求且不必要时,有特定例外的代码

“我听说我应该在我的其他语句中加工资,否则错误可能被隐藏在外部代码块中?”

一般来说,是的。根据我前面的观点,我们应该为特定的可预见异常编写显式处理。WHEN OTHERS子句是为其他所有内容保留的,这是不可预见的异常,因此我们不太可能编写适用于所有情况的通用处理程序。重新引发异常并允许调用程序决定如何处理异常非常重要

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


就处理异常而言,重要的是尽可能多地记录信息,包括真实的错误消息和相关变量或参数<代码>没有DEPTNO=[40]的员工记录
比发生错误
更有用。另外,
dbms\u output.put\u line
不是日志:在现实生活中,我们需要将信息持久化到表或文件中,因为PL/SQL程序通常在后台运行,而不是在客户机上运行,因此没有屏幕可供输出

读源代码的频率比写源代码的频率高。若你们的代码是有表现力的,并且符合标准,那个么其他人就更容易理解(而“其他人”在六个月内就包括你们)

异常块的标准方法是为我们需要处理的特定异常使用单独的WHEN子句,并在其他异常需要默认处理程序时使用WHEN。当其他条款不符合要求且不必要时,有特定例外的代码

“我听说我应该在我的其他语句中加工资,否则错误可能被隐藏在外部代码块中?”

一般来说,是的。根据我前面的观点,我们应该为特定的可预见异常编写显式处理。WHEN OTHERS子句是为其他所有内容保留的,这是不可预见的异常,因此我们不太可能编写适用于所有情况的通用处理程序。重新引发异常并允许调用程序决定如何处理异常非常重要

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


就处理异常而言,重要的是尽可能多地记录信息,包括真实的错误消息和相关变量或参数<代码>没有DEPTNO=[40]的员工记录比发生错误更有用。另外,
dbms\u output.put\u line
不是日志:在现实生活中,我们需要将信息持久化到表或文件中,因为PL/SQL程序通常在后台运行,而不是在客户机上运行,因此没有屏幕可供输出

对于您的第一个问题:因为第一种情况下,如果您得到[error code 2],您的程序仍然会产生错误,但在第二种情况下,
其他人
会覆盖它,因此您的程序认为您已经处理了该错误,并且不会产生任何错误。@PhamX.Bach谢谢!这很有道理,这可能就是为什么你需要在其他人身上重新提高超标率,以确保它在其他地方传播并得到正确处理?起初我不理解你的最后一个问题,但在你的评论中,我认为你自己有答案。是的,最坏的情况类似于
当其他人然后dbms_输出时;结束
然后该过程似乎总是成功完成,而您后来才发现它由于索引块损坏而失败了一周。我还要补充一点,RAISE并不理想,因为您的异常现在只显示为源自RAISE语句,而不是原始行。语法“当其他人。。。只有在没有其他选择的情况下(即,当有资源必须释放时)才应使用RAISE。对于第一个问题:因为第一种情况下,如果您得到[error code 2],您的程序仍然会引发错误,但在第二种情况下,
其他人
会覆盖它,因此您的程序认为您已经处理了该错误,它不会引起任何错误。@PhamX.Bach谢谢!这是很有道理的,这可能就是为什么你需要在其他人中重新提出超标,以确保它向上传播,并在其他地方得到正确处理?起初,我不理解你的最后一个问题,但在你的评论中,我认为