簡體   English   中英

SAS:如何防止發生錯誤時終止

[英]SAS: How to Prevent ABORT on Error

我有&syserr.的預期錯誤&syserr. 1020 遇到錯誤時,程序將終止,並顯示以下消息:

FATAL: Unrecoverable I/O error detected in the execution of the DATA step program.
       Aborted during the EXECUTION phase.

我知道問題出在哪里,沒有解決方案。 但是,由於我知道導致問題的原因,所以我想在程序終止之前提醒用戶如何解決問題。

也就是說,在發生錯誤和程序中止之間,我要執行一些代碼。

我搜尋了互聯網,卻找不到任何無法完成的信息。 實際上,關於SO的許多答案都暗示可以做到。 但是我不知道如何。

由於您知道已設置&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中默認情況下禁用此功能。

盡管比較笨拙,但可以使用%LABEL%GOTO語句來獲得所需的結果。

必須注意的是

“作為%GOTO語句目標的標簽必須存在於當前宏中;您不能使用%GOTO語句跳轉到另一個宏中的標簽。”

由於錯誤是在宏中已有的代碼內發生的,因此不能使用單獨的宏來處理錯誤事件。 (SAS建議不要在其他宏內部創建宏)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM