You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAS EG如何实现类似Python try-except的异常捕获处理逻辑

SAS EG 类try-except异常处理实现

SAS EG 没有和Python try/except 同名的语法关键字,但完全可以实现「主逻辑报错自动走备用分支」的效果,你直接把try:、except:当SAS关键字写的写法不符合语法规则,无法正常运行。

核心原理

SAS每执行完一步代码,都会自动往两个全局宏变量里写入运行状态,完全可以用来做错误判断:

  • &SYSERR:记录通用步骤的运行结果,值为0代表步骤无错误,非0值就是对应类型的错误码
  • &SQLRC:专门记录PROC SQL步骤的运行结果,值为0代表SQL执行成功,非0代表SQL执行报错

要实现主备源表自动切换的需求,只要在主逻辑跑完后判断这两个值,只要有一个非0就走备用表的逻辑即可。注意提前把SAS默认的「碰到错误就终止全流程」的选项关掉,不然第一个错误触发后,后面的分支代码根本不会执行。

可直接复用的实现代码

/* 提前配置:报错后不终止后续代码执行 */
OPTIONS NOSYNTAXCHECK NOERRORABEND;

/* 主逻辑:优先读主源表,对应Python的try块 */
%_eg_conditional_dropds(WORK.QUERY_FOR_KUNDE_REA_UDL_20_0000);
PROC SQL;
   CREATE TABLE WORK.QUERY_FOR_KUNDE_REA_UDL_20_0000 AS 
   SELECT t1.Z_ORDINATE, 
          input(t1.cpr_se,w.) AS KundeNum
      FROM &str_PERIOKVT_PREV_YYMMN6;
QUIT;

/* 错误分支:主逻辑报错就走备用源表,对应Python的except块 */
%if &SQLRC ne 0 or &SYSERR ne 0 %then %do;
    %put NOTE: 主源表读取失败,自动切换至v2版本备用源表;
    %_eg_conditional_dropds(WORK.QUERY_FOR_KUNDE_REA_UDL_20_0000);
    PROC SQL;
       CREATE TABLE WORK.QUERY_FOR_KUNDE_REA_UDL_20_0000 AS 
       SELECT t1.Z_ORDINATE, 
              input(t1.cpr_se,w.) AS KundeNum
          FROM &str_PERIOKVT_PREV_YYMMN6_v2;
    QUIT;
%end;

/* 可选:执行完恢复默认系统配置 */
OPTIONS SYNTAXCHECK ERRORABEND;

补充说明

  • 如果你用的SAS EG版本在9.4 M6之前,开放代码不支持直接写%if判断,把上面的判断逻辑包进一个自定义宏里调用即可,核心逻辑不需要改动
  • 如果需要更细分的错误分支(比如区分是表不存在、字段缺失还是数据类型不匹配),直接判断&SYSERR和&SQLRC的具体错误码对应不同处理逻辑即可,不需要额外安装插件
  • 这个写法是原生SAS语法支持的,不依赖EG专属组件,在普通SAS Base环境里也能正常运行

内容的提问来源于stack exchange,提问作者Christoffer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:39:27