为什么尝试...除了块在这里不起作用

Why try ... except block is not working here

我正在尝试 运行 使用 try.. except 块跟踪代码:

program TriangleArea;
uses crt, sysutils;
type 
    num = real; 
var
  a, b, c, s, area : num; 
begin
    write('Enter lengths of 3 sides (separated by spaces): '); 
    try
        readln (a, b, c);
        s := (a + b + c)/2.0;
        area := sqrt(s * (s - a)*(s-b)*(s-c));
        writeln(area);     
    except
        on E: Exception do
            ShowMessage( 'Error: '+ E.ClassName + #13#10 + E.Message ); 
    end; 
end. 

但它给出了以下错误:

$ fpc triangle_area.pas
Free Pascal Compiler version 3.0.0+dfsg-11+deb9u1 [2017/06/10] for x86_64
Copyright (c) 1993-2015 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling triangle_area.pas
triangle_area.pas(14,2) Error: Identifier not found "try"
triangle_area.pas(15,3) Fatal: Syntax error, ";" expected but "identifier READLN" found
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode

为什么找不到 "try" 标识符。我在 Debian 稳定 Linux 上使用 fpc 版本 3.0.0。

问题出在哪里,如何解决?谢谢你的帮助。

{$MODE OBJFPC}{$MODE DELPHI} 放在程序声明下方。

原因是编译器默认会在MODE FPC编译,不支持异常

其他来源:One Two Three

另一方面,ShowMessage 指令不能用 Free Pascal 编译。正确的代码是:

program TriangleArea;
{$mode delphi}
uses crt, sysutils;
type
    num = real;
var
  a, b, c, s, area : num;
begin
    write('Enter lengths of 3 sides (separated by spaces): ');
    try
        readln (a, b, c);
        s := (a + b + c)/2.0;
        area := sqrt(s * (s - a)*(s-b)*(s-c));
        writeln(area);
    except
        on E: Exception do
            write( 'Error: '+ E.ClassName + #13#10 + E.Message );
    end;
end.

稍后编辑:声明 type num=real 是正确的,但我没有看到它有任何实际用途。