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
相关产品推荐
相关产品推荐

