德尔福柏林10.1分零缺失异常

时间:2017-12-02 19:23:26

标签: delphi exception delphi-10.1-berlin

我很惊讶没有获得除零异常。我如何取回它?

柏林10.1最新安装,新项目,

procedure TForm1.Button1Click(Sender: TObject);
var
  a: Double;
begin
  a := 5/0;                     // No exception
  ShowMessage(a.ToString);      // -> 'INF'
end;

2 个答案:

答案 0 :(得分:7)

a := 5/0;

表达式5/0在技术语言中是constant expression

  

常量表达式是编译器可以在不执行其发生的程序的情况下进行求值的表达式。常量表达式包括数字;字符串;真常数;枚举类型的值;特殊常量True,False和nil;和表达式由这些元素专门构建,包含运算符,类型转换和集合构造函数。

因此,这个表达式由编译器评估,而不是在运行时。因此,它的评估由编译时规则决定,不受运行时浮点单元异常掩码的影响。

这些规则规定正值除以零等于+INF,即一个特殊的IEEE754值。如果将表达式更改为至少有一个不是常量表达式的参数,那么它将在运行时进行计算,并且将引发除零异常。

答案 1 :(得分:4)

您可以使用Math单元中的SetExceptionMask函数控制触发哪些浮点异常:http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Math.SetExceptionMask

要禁用所有浮点异常,请使用:

SetExceptionMask([]);

要启用所有浮点异常,请使用:

program test;
uses Math;
var
  xx,yy: double;
begin
SetExceptionMask([]);
xx := 1;
yy := 0;
halt(round(xx/yy));
end.

另请注意,在您的示例代码中,编译器将在编译时确定值(因为表达式是常量),因此无论传递给SetExceptionMask的值如何,它都不会触发异常。要触发异常,您需要一个稍微复杂的示例,如下所示:

Sub Web_Data()

    Dim IE As New InternetExplorer, html As HTMLDocument
    Dim elem As Object, post As Object

    With IE
        .Visible = False
        .navigate "http://www.morningstar.com/funds/XNAS/DODFX/quote.html"
        Do While .readyState <> READYSTATE_COMPLETE: Loop
        Set elem = .document.getElementById("quote_quicktake").getElementsByTagName("iframe")(0)
        .navigate elem.src
        While .readyState < 4:  DoEvents:  Wend
        Set html = .document
    End With
    Set post = html.getElementsByClassName("gr_text_bigprice")(1).getElementsByTagName("span")(1)
    MsgBox post.innerText

    IE.Quit
End Sub