RAISE_EXCEPTION — RAISE_EXCEPTION Dump: Uncaught Classic Exception
RAISE_EXCEPTION is a runtime termination caused by a classic, non-class-based exception (raised with RAISE inside a function module, subroutine or method) that the caller did not name in its EXCEPTIONS list and did not catch via OTHERS. The fix is almost always to update the caller's EXCEPTIONS addition, not to suppress the error.
This page covers the RAISE_EXCEPTION short dump that occurs when a classic-style RAISE statement inside a function module or subroutine fires an exception the caller never declared. It walks through the usual causes tied to interface drift after upgrades or custom development, what to read in ST22, and why blanket OTHERS handling makes the underlying problem worse.
Published 16 Sept 2026· 1,201 words
What the dump means
RAISE_EXCEPTION belongs to the pre-object-oriented exception mechanism, the one used with FUNCTION ... EXCEPTIONS lists and RAISE <name> inside FORM routines or function modules. Under this model the caller must explicitly name every exception it wants to trap, either individually or with the catch-all OTHERS, on the CALL FUNCTION or PERFORM statement. When the routine executes RAISE <name> and that name was not in the caller's list, and OTHERS was not specified either, the kernel has nowhere to route control and terminates the program. This is not the same mechanism as TRY/CATCH with class-based exceptions, which produces UNCAUGHT_EXCEPTION instead. RAISE_EXCEPTION almost always indicates a mismatch between what a called routine's interface can raise and what the calling code was written to expect, usually because one side changed after the other was written.
Root causes that actually produce it
- Interface drift after an upgrade or support package: SAP or an internal team added a new named exception to a standard or custom function module's signature, and every existing caller still lists only the old set, so the new exception falls through uncaught.
- Missing OTHERS on the call: developers list the exceptions they were aware of at the time of writing but never add OTHERS, on the assumption the named list is exhaustive. It rarely stays exhaustive once the called routine is maintained by someone else.
- RFC or BAPI version mismatch: the calling system's local stub interface for a remote-enabled function module predates a change made to the remote system's implementation, so the local caller's exception table is missing an exception the remote side now raises.
- Refactored subroutine, stale PERFORM call: a FORM was extended to raise an additional exception during a fix, but PERFORM sites elsewhere in the program (or in other programs sharing the include) were not all updated with the new exception name.
- Dynamic function module calls built with a programmatically constructed EXCEPTIONS table: batch frameworks or generic wrappers that assemble the exceptions parameter at runtime sometimes omit an exception because the list was hardcoded once and never revisited when the target FM's interface changed.
- Copy-paste from documentation: developers copying a BAPI call pattern from an example or an old program bring along an incomplete exception list, dropping generic ones like a system failure or communication failure exception that the original example happened to omit.
What to inspect in ST22
- Exception field in the dump header: gives the exact classic exception name that was raised and not caught, this is the string to search for in the called routine's source.
- Trigger location (program, include, line): points at the RAISE statement itself, confirming which routine and which condition inside it fired the exception.
- Call stack (source code / active calls section): the line immediately above the trigger location is the CALL FUNCTION or PERFORM statement in the caller, this is what needs correcting.
- Compare the EXCEPTIONS addition on that call statement against the full exception list in the routine's interface, visible in SE37 for function modules or the FORM statement itself for subroutines.
- SY-SUBRC and any values in effect at termination, useful for judging whether the exception condition is a genuine business error or a defensive check that should never have reached the caller uncaught.
- If the routine is remote-enabled, check the RFC destination and compare the local interface copy against the remote system's current signature using SE37 there, to catch version mismatches.
Resolution path
If the cause is a missing named exception in a custom program's call statement, add the exception name to the EXCEPTIONS addition and write explicit handling for it, then transport the change; this is a mandatory change request since it touches program logic. If the cause is a standard SAP function module whose interface changed via support package, check whether the correction is already delivered as a modification to the call itself; if the call sits in custom code, the fix still has to be made locally and transported. If the cause is an RFC or BAPI version mismatch between systems, coordinate the interface versions or add OTHERS with logged, non-silent handling as an interim measure while the version alignment is scheduled. If the cause is a stale PERFORM after a subroutine refactor, update every call site found through a where-used list, not just the one that dumped, since others are likely to fail the same way under different data. None of these should be closed with OTHERS alone unless a genuine handling branch is written behind it.
The fix people try first (and why it fails)
The reflex fix is adding EXCEPTIONS OTHERS = 9 (or similar) to the call purely to stop the dump, with no code afterward that inspects SY-SUBRC or reacts to it. This does stop the termination, but it also silently swallows whatever business condition triggered the exception in the first place, such as a locked master record, insufficient stock, or a failed authorization check inside the called routine. The program then falls through to the next statement as if nothing happened, often producing a worse failure downstream: a posting that should not have happened, a document created against invalid data, or a batch job that reports success while having skipped real work.
Prevention
Enforce a code review rule that any CALL FUNCTION or PERFORM using the classic EXCEPTIONS mechanism must list every exception in the called routine's current interface, with OTHERS present only as a last resort and always followed by explicit error handling, never left empty. When changing the exception interface of a shared function module or subroutine, run a where-used analysis before release and update every caller in the same transport. For RFC-based BAPI calls, regenerate or re-check the local proxy interface whenever the remote system's function module signature changes.
Whose problem this is
This is an ABAP development issue, not Basis, since it is resolved by correcting the exception list on a call statement. If the underlying routine is standard SAP and its interface changed through an upgrade, functional involvement is needed to confirm the business meaning of the new exception before deciding how to handle it. The handover note should include the function module or subroutine name, the exception name, the exact caller program and line, and the business scenario that triggered the RAISE.
Related SAP objects
Reviewed pages this object connects to in the ERPClimb knowledge graph.
Source: ERPClimb — https://erpclimb.com/sap-abap-dumps/raise-exceptionERPClimb is an independent platform and is not affiliated with SAP SE. Reference pages are written and reviewed by SAP consultants for learning and troubleshooting.