显式引发异常的应用

赤井

在程序中显式引发异常的应用程序和优点是什么?例如,如果我们专门考虑Ada语言,则此处提供了一个接口来引发程序中的异常。例子:

raise <Exception>;

但是,我们需要明确提出例外的优势和应用领域是什么?

例如,在接受参数之一作为字符串的过程中:

function Fixed_Str_To_Chr_Ptr (Source_String : String) return C.Strings.Chars_Ptr is
...
begin
...
  -- Check whether source string is of acceptable length
  if Source_String'Length <= 100 then
  ...
  else
    ...
    raise Constraint_Error;
  end if;

  return Ptr;

exception
     when Constraint_Error=>
        .. Do Something..
end Fixed_Str_To_Chr_Ptr;

如果我在上述函数中引发异常并在传递的字符串长度范围超出可容忍的限制时进行处理,是否有任何好处或良好的做法?还是应该使用简单的If-else处理程序逻辑来完成业务?

布赖恩·德拉蒙德(Brian Drummond)

给定示例有两个问题:

  1. 控制流不需要异常就足够简单了。但是,情况并非总是如此,我稍后再讲。
  2. Constraint_Error检测字符串长度错误是一个异常严重的异常。标准的例外Program_ErrorConstraint_ErrorStorage_Error应该被保留用于编程错误的条件,并且在大多数情况下,应该打倒的可执行程序,它可以做任何损害之前,有足够的调试信息(在栈回溯至少),让你发现其中的错误并保证它不会再发生。

非常Constraint_Error怪异地接近错误,这是令人非常满意的,而不是后来发生的任何未定义的行为……(了解如何打开堆栈回溯,这是非常有用的,默认情况下通常不打开)。

相反,您可能想定义自己的String_Size_Error异常,引发并处理它。然后,您未显示的代码中引发的任何其他内容都Constraint_Error将被正确调试,而不是无声地生成错误的Chars_Ptr


对于引发异常的有效用例,请考虑使用电路仿真器,例如SPICE(或用于气流的CFD仿真器等)。这些工具,即使工作正常,由于矩阵计算中出现的数字问题也容易出现故障。(两个项相抵消,产生零+/-舍入误差,这将导致不可行的大数或以后被零除)。它通常是迭代近似值,其中误差应在每个步骤中减小,直到它是一个可接受的低值为止。但是,如果发生故障,则错误项将开始增长。

通常,仿真是逐步进行的,其中每个步骤都是一个足够小的时间步长,可能是1 us或1 ns。主循环请求一个步骤,该请求被传递给模拟中代表电路组件或CFD网格中三角形的数千个代理。

这些代理中的任何一个都可能无法计算解决方案,并且处理故障的最简单方法是引发异常,也许Convergence_Error可能存在成千上万的可能引发异常的点。

测试成千上万的返回码会很快变得很丑陋。但是除了例外,主循环仅需要一个处理程序,该处理程序将采取一些纠正措施,例如减小模拟步长并再次运行该步。

清理浏览器中输入的用户文本可能是另一个很好的用例,更接近示例代码。


关于异常的运行时代价一词:Gnat编译器及其RTS支持“零成本例外”(ZCX)模型-至少对于某些目标而言。当引发异常时,会有更大的惩罚,这是在正常情况下要消除惩罚的折衷方案。如果罚款对您来说很重要,请参考文档以了解您的情况是否值得9甚至可能)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

jlink:ed应用程序中的记录引发异常

来自分类Java

引发异常后,如何敦促应用程序继续运行?

来自分类Dev

如何在C ++中显式调用抛出异常的方法?

来自分类Dev

如果try块不包含显式引发异常的代码,是否有理由仅捕捉异常以再次引发异常?

来自分类Dev

TimeZoneInfo.FindSystemTimeZoneById()在Unity应用程序中引发异常

来自分类Dev

为什么将List <double>显式转换为IEnumerable <object>会引发异常?

来自分类Dev

获取先前在应用程序C#中引发的异常?

来自分类Dev

如何专门处理显式类型的应用程序?

来自分类Dev

通过Idea打开Gradle应用程序时引发异常

来自分类Dev

Android应用程序引发Guice异常

来自分类Dev

显式导致.NET应用程序中的AccessViolationException

来自分类Dev

无法登录Firebase帐户会引发异常并停止Flutter应用

来自分类Dev

无法在我的脚本中应用显式等待

来自分类Dev

引发异常或引发Exception()

来自分类Dev

从层次结构中捕获显式异常

来自分类Dev

为什么当引发异常时应用程序不会崩溃

来自分类Dev

Flutter应用中的远程配置在获取时引发异常

来自分类Dev

是否需要在C#中显式引发异常?

来自分类Dev

从应用程序获取显式加载的DLL的符号

来自分类Dev

Selenium即使显式等待也会引发NoSuchElementException

来自分类Dev

C#Winforms应用程序挂起,而不是引发异常

来自分类Dev

引发应用程序异常会导致TransactionalException

来自分类Dev

Django .get()在没有显式'__exact'查找的情况下引发DidNotExist错误

来自分类Dev

调用.commit()时,Android应用引发致命异常

来自分类Dev

严格模式下Angular应用的httpBackend显式批注

来自分类Dev

C++显式构造函数的应用

来自分类Dev

Excel VBA - 显式引用当前应用程序实例

来自分类Dev

在 Typescript 中为 Intercom 的窗口显式设置类型会引发错误

来自分类Dev

OCaml 是否支持显式类型应用程序?

Related 相关文章

  1. 1

    jlink:ed应用程序中的记录引发异常

  2. 2

    引发异常后,如何敦促应用程序继续运行?

  3. 3

    如何在C ++中显式调用抛出异常的方法?

  4. 4

    如果try块不包含显式引发异常的代码,是否有理由仅捕捉异常以再次引发异常?

  5. 5

    TimeZoneInfo.FindSystemTimeZoneById()在Unity应用程序中引发异常

  6. 6

    为什么将List <double>显式转换为IEnumerable <object>会引发异常?

  7. 7

    获取先前在应用程序C#中引发的异常?

  8. 8

    如何专门处理显式类型的应用程序?

  9. 9

    通过Idea打开Gradle应用程序时引发异常

  10. 10

    Android应用程序引发Guice异常

  11. 11

    显式导致.NET应用程序中的AccessViolationException

  12. 12

    无法登录Firebase帐户会引发异常并停止Flutter应用

  13. 13

    无法在我的脚本中应用显式等待

  14. 14

    引发异常或引发Exception()

  15. 15

    从层次结构中捕获显式异常

  16. 16

    为什么当引发异常时应用程序不会崩溃

  17. 17

    Flutter应用中的远程配置在获取时引发异常

  18. 18

    是否需要在C#中显式引发异常?

  19. 19

    从应用程序获取显式加载的DLL的符号

  20. 20

    Selenium即使显式等待也会引发NoSuchElementException

  21. 21

    C#Winforms应用程序挂起,而不是引发异常

  22. 22

    引发应用程序异常会导致TransactionalException

  23. 23

    Django .get()在没有显式'__exact'查找的情况下引发DidNotExist错误

  24. 24

    调用.commit()时,Android应用引发致命异常

  25. 25

    严格模式下Angular应用的httpBackend显式批注

  26. 26

    C++显式构造函数的应用

  27. 27

    Excel VBA - 显式引用当前应用程序实例

  28. 28

    在 Typescript 中为 Intercom 的窗口显式设置类型会引发错误

  29. 29

    OCaml 是否支持显式类型应用程序?

热门标签

归档