Skip to content

Make failing interface/object casts catchable by script try/except#303

Open
TetzkatLipHoka wants to merge 1 commit into
remobjects:masterfrom
TetzkatLipHoka:fix/catchable-cast-errors
Open

Make failing interface/object casts catchable by script try/except#303
TetzkatLipHoka wants to merge 1 commit into
remobjects:masterfrom
TetzkatLipHoka:fix/catchable-cast-errors

Conversation

@TetzkatLipHoka

Copy link
Copy Markdown

The cast import (SpecImport's CastProc) reported failed interface and
'as' casts via CMD_Err2 and then returned False. CMD_Err2 already
dispatches the error to the script's active exception handler and
resets the pending-error state - so when the external proc afterwards
returned False, the interpreter raised a second erCouldNotCallProc for
which the handler was already consumed. Net effect: a failing cast
could never be caught by try/except in a script, and the descriptive
'Cannot cast an interface/object' message was replaced by a generic
'Could not call proc'.

Return True after CMD_Err2 instead, exactly like the DefProc builtins
handle their reported errors (e.g. the string index checks). A failing
cast now surfaces as a regular catchable runtime error with its proper
message:

try
f := IMyFoo(u); // u does not implement IMyFoo
except
// reached now; previously the script died with 'Could not call proc'
end;

Pairs with the variant-interface-casts PR: the last check of that repro needs this fix; both branches merge cleanly together.

🤖 Generated with Claude Code

The cast import (SpecImport's CastProc) reported failed interface and
'as' casts via CMD_Err2 and then returned False. CMD_Err2 already
dispatches the error to the script's active exception handler and
resets the pending-error state - so when the external proc afterwards
returned False, the interpreter raised a second erCouldNotCallProc for
which the handler was already consumed. Net effect: a failing cast
could never be caught by try/except in a script, and the descriptive
'Cannot cast an interface/object' message was replaced by a generic
'Could not call proc'.

Return True after CMD_Err2 instead, exactly like the DefProc builtins
handle their reported errors (e.g. the string index checks). A failing
cast now surfaces as a regular catchable runtime error with its proper
message:

  try
    f := IMyFoo(u);  // u does not implement IMyFoo
  except
    // reached now; previously the script died with 'Could not call proc'
  end;

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant