A hard cast reinterprets memory. It might access random memory and anything can happen (tm). Including exceptions, but not *guaranteed* so.
AS is basically something like
function asintern.al(sss:tobject;someclass:TSomeClassType):<type of tsomeclasstype, compiler magic>
if sss IS TSomeclass then
result:=tsomeclass
else
raise exception.create
If you usually capture the exception, basically by doing IS yourself you avoid the raising + catching of the exception.
But no, there are no variations on cast. Some code relies on it throwing an exception when the class isn't right.
You could maybe add an assert with IS though to get the same effect.
assert(obj IS TSomeclass); // will throw an exception if obj is not tsomeclass or derivative.
and asserts can be turned on and off.