bcquality/custom/knowledge/patterns/cmfrt-case-requires-else.md
BeytullahCengiz88 c72c0ad685 Add CMFRT coding standards documentation and examples
- Introduced guidelines for "one codeunit one global function" architecture to enforce single responsibility in AL code.
- Added best practices and anti-patterns for adding parameters via overloads to maintain backward compatibility.
- Documented the importance of never deleting members in AL and always marking them as obsolete.
- Established the requirement for OnBefore and OnAfter integration events for global procedures to enhance extensibility.
- Defined naming conventions for CMFRT objects, including prefixes and object ID ranges to avoid conflicts.
- Implemented patterns for case statements to ensure all cases are handled, including the necessity of an else clause.
- Introduced the interface injection pattern to allow pluggable operations in table-level code.
- Recommended using Confirm Management for user confirmations to improve testability.
- Established a three-permission set pattern for security to ensure proper access control.
- Created a review skill for CMFRT AL standards to automate compliance checks against established guidelines.
2026-07-02 13:12:09 +00:00

1.5 KiB

bc-version domain keywords technologies countries application-area
all
patterns
case
else
defensive-coding
unhandled-case
enum
option
silent-failure
al
w1
all

CMFRT CASE statement requires ELSE clause

Description

Every case statement in CMFRT AL code must include an else clause. The rule is unconditional: even when every currently known value of the matched expression is enumerated, the else clause guards against future values being added to an enum, option field, or integer range. Without else, a new value passes through the case block silently — no error, no action — and the resulting silent no-op or data corruption is difficult to trace because the case appears correct at the time it was written.

Best Practice

Always add an else clause to every case statement. When no meaningful action applies to unexpected values, the else clause should raise an error that identifies the unexpected value, log it, or call a dedicated handler procedure. The key outcome is that the unexpected case is detected at runtime rather than silently ignored.

See sample: cmfrt-case-requires-else.good.al.

Anti Pattern

Writing a case statement that enumerates all currently known values and omits else. The code appears complete but becomes a silent failure mode the moment a new enum value is added by a future developer or by a base application update, because the added value simply falls through the entire case block.

See sample: cmfrt-case-requires-else.bad.al.