Interesting question. It indeed might worth few words in the next revision.
However, although Exception looks as something special it is not really. What is really special is the
raise and the two structures to do something with the raised exception:
try..finally..end and
try..except..end.
If you look at the following code, it is perfectly valid:
program project1;
{$mode objfpc}
uses
SysUtils;
var
i : integer;
begin
readln(i);
try
if i = 2 then
raise TObject.Create();
except
writeln('In except');
end;
end.
The object (class instance) raised by
raise does not need to be of class type Exception.
If you remove the
try..except..end from the above program, it still prints an exception (if i = 2) on screen from SysUtils, like
An unhandled exception occurred at $00000000004010DA:
Exception object TObject is not of class Exception.
$00000000004010DA main, line 12 of project1.lpr
If you even remove SysUtils, then you get a Runtime error, like
Runtime error 217 at $0000000000413FA2
$0000000000413FA2
$0000000000422D5C
i.e. SysUtils prints the message from the Exception if that is used to call
raise, or prints the type of the class instance if it is not an Exception (or its descendant). You can try to raise an exception with other TObject descendants (I tried TStringList and it works the same).
If there is no SysUtils then a simple error message is generated as noone catches the raised exception.
The clause "all objects are inherited from TObject and therefore start with T", but wait there is exception...
I might not know my doc well enough, but I do not remember this quote (and cannot find it in it, neither in the Wiki under Class). Is it from somewhere else? Btw. you can name your class type (almost) anything you want to, so those who wrote SysUtils were perfectly allowed to call their class type: Exception. To my taste TException would fit better, but "De gustibus non est disputandum".