2012-01-25 117 views

回答

13

錯誤= 1個選項被先前建議,但只有停止他從寫日誌的錯誤消息。我會建議另一個系統選項ERRORABEND,它會阻止程序進一步處理大多數錯誤。我不知道由於警告而終止處理的選項,但我認爲您可以添加如下的宏來停止處理。

%macro check_for_errors; 
    %if &syserr > 0 %then %do; 
     endsas; 
    %end; 
%mend check_for_errors; 

data test1; 
    <data step code> 
run; 
%check_for_errors; 

你可以在你的程序的每一步後重復宏調用,它應該在的錯誤代碼是什麼,但0

+1

應該詳細瞭解ERRORS =選項...刪除了我的答案並更新了您的答案 –

+1

有沒有像ERRORABEND選項那樣不會導致與SAS服務器斷開連接?我使用連接到外部unix服務器的EG,雖然在第一個錯誤時停止處理會很好,但ERRORABEND會關閉到服務器的連接,這需要一段時間才能在下次運行時重新建立連接。 – orh

+1

您可能還會檢查'&syserrortext'是否爲非空。我發現這個變量比'&syserr'更可靠。 –

2

我經常做類似的東西RWill點結束,但我用宏包裝我的整個程序。每個DATA步驟之後,PROC SQL,PROC SORT等我檢查錯誤代碼(& SYSERR或& SQLRC)。如果它不是零,我會跳到最後。

更多細節及代碼在這裏:https://heuristically.wordpress.com/2012/02/09/return-codes-errors-sas/

我不能使用,因爲我們組織的批處理系統如何運行在一個SAS會話獨立的程序RWill的endsas。

+0

這太棒了!只需閱讀博客條目並試用即可。多年來,我一直傻傻地認爲SAS不能自動工作。 快速提問:在檢查PROC SQL錯誤時,我是否必須使用SQLRC變量,還是僅當我關心恢復SQL錯誤代碼時才使用SQLRC變量?它看起來像SYSERR與PROC SQL一起工作,但我想仔細檢查。再次感謝! –

+1

@sparc_spread:如果您不在意處理PROC SQL中的錯誤,那麼請不要檢查錯誤代碼。我認爲這可能有用的一種情況是使用'drop table foo;'並且不關心表是否存在。 – Andrew

+0

太棒了,再次感謝。 –

3

一種選擇是將run全部替換爲run &g_cancel,將proc sql;替換爲proc sql &g_noexec;。最初&g_cancel&g_noexec被設置爲無,所以一切運行。

在擊中的錯誤(或者%sys_rc%sql_rc或使用參照業務邏輯)設置&g_cancel取消並&g_noexec爲noexec。

這應該停止任何後續步驟運行 - 顯然宏觀變量可以爲具有或檢查執行純粹宏步驟之前,無論運行(一收拾爲例)步驟可以省略。

企業指南用戶注意事項:唯一的警告提示是,如果您在同一個會話中運行多個代碼項目,則需要在每個代碼項目開始時重置錯誤條件,以免無關的錯誤停止任何工作。

+0

我想你的意思是'替換'運行「與第一句 –

3

我一直在使用最近%runquit宏。適用於批處理作業和交互式會話(不關閉會話,停止運行代碼)。

來源:http://www.cpc.unc.edu/research/tools/data_analysis/sas_to_stata/sas-macros/runquit.html

要使用它,你基本上是在任何數據步驟結束鍵入%runquit;或PROC而不是鍵入你的正常runquit聲明。

代碼:

%macro runquit; 
    ; run; quit; 
    %if &syserr. ne 0 %then %do; 
    %abort cancel; 
    %end; 
%mend runquit; 

Datastep用法:

data something; 
* do some stuff; 
%runquit; 

PROC用法:

proc sql; 
    * do some stuff; 
%runquit; 

它不是很漂亮時,通過讀碼,但它確實使調試了很多更輕鬆。

2

以補充Rwill的回答是:

如果使用存儲過程(STP),它也是不錯的,當出現錯誤時不顯示登錄到您的用戶,並刪除「顯示SAS日誌」按鈕。

可與本

%macro checkcc; 
    options obs=max no$syntaxcheck; 
    %if (&syscc gt 4) %then 
     %do; 
      data _null_; 
       file _webout; 
       put "<h3>Sorry, your request was not processed successfully.<h3>"; 
       rc = stpsrvset('program error', 0); 
      run; 
     %end; 
    %let syscc=0; 
%mend checkcc; 
%checkcc; 

源來實現:http://support.sas.com/kb/16/225.html

這裏是我做出依然顯示JSON格式錯誤的增強版本。

%macro checkErrors; 
    options obs=max no$syntaxcheck; 
    %let old = %sysfunc(stpsrv_header(Content-type, application/json%str(;) charset=utf-8)); 
    %put &=syscc; %put &=syserr; %put &=sysrc; %put &=syswarningtext; %put &=syserrortext; 
    %if (&syscc gt 4) %then %do; 
     data _null_; 
      file _webout; 
      put '{'; 
      put ' "success":"false"'; 
      put ' ,"message":"' "&syserrortext" '"'; 
      put ' ,"syscc":"' "&syscc" '"'; 
      put '}'; 
      rc = stpsrvset('program error', 0); 
      run; 
     %end; 
    %let syscc=0; 
%mend checkErrors; 
%checkErrors; 

和HTML版本:

%macro checkErrors_HTML; 
    options obs=max no$syntaxcheck; 
    %if (&syscc gt 4) %then %do; 
     data _null_; 
      file _webout; 
      put '<!doctype html> '; 
      put '<html> '; 
      put ' <head> '; 
      put '  <title>Error</title> '; 
      put ' </head> '; 
      put ' <body> '; 
      put '  <h1>An Error Occured</h1>'; 
      put '  <p>' "&syserrortext" '</>'; 
      put ' </body>'; 
      put '</html>'; 
      rc = stpsrvset('program error', 0); 
      run; 
     %end; 
    %let syscc=0; 
%mend checkErrors_HTML; 
%checkErrors_HTML; 
+0

」run&cancel「'非常好!大概你還想在那裏放一個'%abort'或'endsas;',這樣程序的其餘部分不會不必要地運行? –

+0

@AllanBowe這不需要在程序中經常使用'%checkErrors'嗎?我只是在STP的最後放置了'%checkErrors',所以我不確定這會有什麼用處。你怎麼看? –

+0

正確,如果在程序結束時不需要中止。我只是考慮一些我自己的用例(長時間運行的STP),如果能夠在程序中間放棄而不會將錯誤發送給客戶端,那麼這很方便。 –

相關問題