从 SAS-EG 执行的 SAS 程序中的 SAS 触发错误



如果某个条件不满足,我需要让 SAS 触发错误 我尝试使用中止返回 n、中止异常结束等。但他们似乎都 断开整个会话的连接,我只想得到一个错误,例如 与语法等。

它是一个 sas 属性图,只能在带有提示的交互模式下从 SAS-EG 运行

我的代码:

DATA _NULL_;
IF prxmatch("/^TBDLZLd{4}_[A-Z]/",&tablename_in) eq 0 then do;
put "error table name &tablename_in does not match";
ABORT RETURN 15; 
END;
RUN;

有什么建议吗?

使用ABORT CANCEL语句。 数据步骤将停止运行,并且不会处理提交的代码中的以下步骤。

例如:

data _null_;
set sashelp.class;
if name = "John" then do;
put 'ERR' 'OR: My error message';
abort cancel;
end;
run;
* This step is not done due to earlier ABORT CANCEL;
data _null_;
set sashelp.class;
where name like 'J%';
run;

从帮助:

CANCEL
会导致已提交语句的执行被取消。 操作取决于操作方法。

  • 批处理模式和非交互模式

    • 终止整个 SAS 程序和 SAS 系统。
    • 将错误消息写入 SAS 日志。
  • 窗口环境和交互线模式

    • 仅清除当前提交的程序。
    • 不影响其他后续提交的程序。
    • 将错误写入 SAS 日志。
  • 工作区服务器和存储进程服务器

    • 仅清除当前提交的程序。
    • 不影响其他后续提交调用。
    • 将错误消息写入 SAS 日志。
  • SAS IntrNet 应用服务器

    • 为每个请求创建单独的执行并提交 请求代码。请求代码中的 CANCEL 参数清除当前 已提交代码,但不会终止执行或 SAS 会话。

您可以尝试使用:

put 'ERROR:' '/*customize error text here*/';

如果要停止执行数据步骤,可以使用stop语句,例如:

DATA _NULL_;
IF prxmatch("/^TBDLZLd{4}_[A-Z]/",&tablename_in) eq 0 then do;
put 'ERROR:' "table name &tablename_in" does not match;
stop; 
END;
RUN;

如果您有宏并且希望在宏执行步骤中收到错误消息,则可以使用%put

%put ERROR: /*customize error text here*/;

谢谢@Tom

请注意,将单词 ERROR(put ‘ERR’ ‘OR:’...( 分成两部分的"技巧"仅在您对日志进行愚蠢的错误搜索时才需要。日志中的正常 SAS 错误消息始终显示在行首。例如,SAS/Studio 不会错误地将包含 ERROR 的程序行标记为实际错误。

谢谢@MichaelKersten

多行笔记,警告和错误的另一个巧妙技巧是 将第二行和连续行的":"替换为"-"。 例:

%put WARNING: first line of warning; 
%put WARNING- second line of warning;

最新更新