SAS:如何在出错时防止ABORT

时间:2016-10-21 18:02:21

标签: error-handling sas

admin_user = User.new admin_user.admin = true admin_user.email = 'your@email.com' admin_user.password = 'my_new_password' admin_user.password_confirmation = 'my_new_password' admin_user.save &syserr.的预期错误。遇到错误时,程序将终止并显示以下消息:

1020

我知道问题是什么,并且没有解决方案。但是,由于我知道导致问题的原因,我想在程序终止之前提醒用户如何修复它。

也就是说,在错误发生和程序中止之间,我想执行一些代码。

我在互联网上搜索过,找不到任何说不能做的事情。事实上,关于SO的许多答案暗示它可以完成。但我不知道怎么做。

2 个答案:

答案 0 :(得分:1)

由于您知道正在设置& syserr,因此可以选择编写自己的%OnError宏,例如:

%macro OnError(debug=0);
  %if &syserr ne 0 %then %do;
    %*blah blah blah;
  %end;
%mend OnError;

所以你的代码看起来像是:

data want;
  set have;
  oops;
run;
%OnError()

请注意,& syserr会在每个步骤边界后重置,因此您需要在可疑步骤后立即对其进行测试。还有其他宏变量,其返回代码仍然存在。

如果错误足以让SAS进入语法检查模式(设置obs = 0和noreplace),则必须执行更多操作才能恢复。但我认为这在交互式SAS中默认是关闭的。

答案 1 :(得分:0)

虽然很笨重,但使用%LABEL%GOTO语句可以达到预期效果。

必须遵守

  

“作为%GOTO语句目标的标签必须存在于   当前宏观;你不能使用a分支到另一个宏中的标签   %GOTO声明。“

由于错误发生在宏中已存在的代码中,因此不能使用单独的宏来处理错误事件。 (SAS建议不要在其他宏内部创建宏。)