【问题标题】:SAS trigger error in SAS program executed from SAS-EG从 SAS-EG 执行的 SAS 程序中的 SAS 触发错误
【发布时间】:2019-12-27 17:41:22
【问题描述】:

如果不满足某个条件,我需要让 SAS 触发错误 我曾尝试使用 abort return n、abort abend 等。但它们似乎都 断开整个会话,我只想得到一个错误 用语法等。

这是一个 sas 程序,只能从 SAS-EG 以交互模式运行,并带有提示

我的代码:

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

RUN;

有什么建议吗?

【问题讨论】:

    标签: sas


    【解决方案1】:

    你可以尝试使用:

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

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

    DATA _NULL_;
       IF prxmatch("/^TBDLZL\d{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;
    

    【讨论】:

    • 你不应该使用 PUT 和 %PUT 吗?
    • 请注意,只有在对日志进行错误搜索时才需要将 ERROR 一词分成两部分的“技巧”。日志中的正常 SAS 错误消息始终出现在行首。例如,SAS/Studio 不会错误地将包含 ERROR 的程序行标记为实际错误。
    • @Tom 就我个人而言,我使用该技巧进行CTRL-F 样式查找,以在日志中搜索ERROR: 的第一次出现。考虑到我在 Base SAS IDE 或 SAS Studio 中,我从来没有选择在搜索表达式中包含换行符。
    • 认为我触发了;),我更喜欢简单的搜索。
    • 另一个多行注释、警告和错误的巧妙技巧是将第二行和连续行的“:”替换为“-”。示例:%put WARNING: first line of warning;%put WARNING- second line of warning;
    【解决方案2】:

    使用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;
    

    来自帮助:

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

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

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

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

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

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

    【讨论】:

    • 如果我们只想中止第一步但继续运行以下步骤,我们可以使用什么来代替“中止取消”。它是宏中的相同命令吗?谢谢...
    • 在宏中使用%ABORT CANCEL 停止所有提交的代码。使用%return 在您选择的位置退出宏。在DATA 步骤中,STOP 语句将在您选择的位置停止该步骤。注意:如果在提交的代码块期间发生错误,会话或提交可能会进入SYNTAXCHECKDMSSYNCHK 模式,或者会话可以终止(基于选项ERRORABEND)——进一步取决于批处理或交互式会话.阅读文档以全面了解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多