在很多 ABAP 项目里,我们谈class-based exception,常常停在TRY ... CATCH、异常层级、RAISING这些语法层面。可真正让人眼前一亮的地方,从来不在语法本身,而在于它终于给了我们一种能力,能把程序的责任边界写进代码里,还能在运行时把责任准确地抛给该负责的那一层。Bertrand Meyer 在 1992 年提出Design by Contract时,讲的就是这件事,软件例程像一份合同,调用方负责满足前提条件,提供方负责兑现结果承诺,类整体还要维持自己的不变量。后来 Microsoft 在.NET Framework里推广Code Contracts,同样也是围绕precondition、postcondition、object invariant这三件事展开。
这个视角一旦建立起来,我们再看 ABAP 里的异常处理,就不会只盯着catch到底怎么写,而会开始问另一个更有工程价值的问题,某个错误到底是谁的责任,调用者,还是被调用者。Meyer 在原始论文里把这件事说得很清楚,precondition失败,责任在client,也就是调用方没有遵守例程入口条件。postcondition失败,责任在supplier,也就是例程自己没有完成承诺。invariant则是类的长期稳定状态,它必须在对象创建完成后成