在程序中显式引发异常的应用程序和优点是什么?例如,如果我们专门考虑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处理程序逻辑来完成业务?
给定示例有两个问题:
Constraint_Error
检测字符串长度错误是一个异常严重的异常。标准的例外Program_Error
,Constraint_Error
,Storage_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] 删除。
我来说两句