2012-01-25 19 views
15

SAS thích tiếp tục xử lý tốt sau khi cảnh báo và lỗi, vì vậy tôi thường cần phải cuộn lại qua các trang trong nhật ký để tìm sự cố. Có cách nào tốt hơn? Tôi muốn nó dừng lại ngay khi lỗi hoặc cảnh báo đầu tiên xuất hiện để tôi có thể sửa lỗi và thử lại.Có cách nào để làm cho SAS dừng lại khi cảnh báo hoặc lỗi đầu tiên không?

+0

Tôi thấy rằng SO các lĩnh vực thắc mắc về lập trình SAS: di cư ở đó. – whuber

Trả lời

13

Tùy chọn ERRORS = 1 đã được đề xuất trước đó, nhưng điều đó chỉ dừng lại các thông báo L ERI từ ghi vào nhật ký. Tôi sẽ đề nghị một lựa chọn hệ thống khác ERRORABEND mà sẽ ngăn chặn chương trình xử lý tiếp tục cho hầu hết các lỗi. Tôi không biết một tùy chọn để chấm dứt xử lý do cảnh báo, nhưng tôi nghĩ rằng bạn có thể thêm macro như sau để ngừng xử lý.

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

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

Bạn có thể lặp lại các cuộc gọi vĩ mô sau mỗi bước của chương trình của bạn, và nó sẽ chấm dứt tại thời điểm đó mã lỗi là bất cứ điều gì nhưng 0.

+1

Nên đọc thêm về ERRORS = tùy chọn ... đã xóa câu trả lời của tôi và cập nhật câu trả lời của bạn –

+1

Có điều gì đó giống như tùy chọn ERRORABEND không gây ngắt kết nối với máy chủ SAS không? Tôi sử dụng EG kết nối với một máy chủ unix bên ngoài và trong khi nó sẽ là tuyệt vời để ngừng xử lý ở lỗi đầu tiên, ERRORABEND đóng kết nối đến máy chủ mà phải mất một lúc để thiết lập lại vào lần chạy tiếp theo. – orh

+1

Bạn cũng có thể kiểm tra xem '& syserrortext' có trống không. Tôi thấy rằng biến này được đặt đáng tin cậy hơn '& syserr'. –

2

tôi thường xuyên làm điều gì đó tương tự như RWill, nhưng tôi bọc toàn bộ chương trình của tôi trong một macro. Sau mỗi bước DATA, PROC SQL, PROC SORT, v.v. Tôi kiểm tra mã lỗi (& SYSERR hoặc & SQLRC). Nếu nó không khác, tôi nhảy đến cùng.

Thông tin chi tiết và mã ở đây: https://heuristically.wordpress.com/2012/02/09/return-codes-errors-sas/

tôi không thể sử dụng endsas vì cách hệ thống hàng loạt tổ chức của chúng tôi chạy chương trình độc lập trong một phiên SAS RWill của.

+0

Điều này thật tuyệt! Chỉ cần đọc các mục blog và đang thử nó ra. Trong nhiều năm, tôi đã chết lặng rằng SAS không hoạt động theo cách này một cách tự động. Câu hỏi nhanh: Tôi có phải sử dụng biến SQLRC khi kiểm tra lỗi PROC SQL hay chỉ khi tôi quan tâm đến việc khôi phục mã lỗi SQL? Có vẻ như SYSERR cũng làm việc với PROC SQL nhưng tôi muốn kiểm tra lại. Cảm ơn một lần nữa! –

+1

@sparc_spread: Nếu bạn không quan tâm đến việc xử lý lỗi trong PROC SQL, thì đừng kiểm tra mã lỗi. Một trường hợp mà tôi có thể nghĩ rằng điều này có thể hữu ích là sử dụng 'drop table foo; 'và bạn không quan tâm liệu bảng có tồn tại hay không. – Andrew

+0

Tuyệt vời, cảm ơn một lần nữa. –

3

Một tùy chọn là thay thế run bằng run &g_cancel trong suốt và proc sql; với proc sql &g_noexec;. Ban đầu &g_cancel&g_noexec được đặt thành không có gì để mọi thứ đều chạy.

Khi gặp lỗi (hoặc %sys_rc, %sql_rc hoặc sử dụng đề cập đến logic nghiệp vụ), hãy đặt &g_cancel để hủy và &g_noexec thành noexec.

Điều này sẽ dừng mọi bước tiếp theo khi chạy - rõ ràng là các biến macro có thể được bỏ qua cho các bước phải chạy bất kể (ví dụ: dọn dẹp) hoặc kiểm tra trước khi thực hiện các bước hoàn toàn bằng macro.

Lưu ý đối với người dùng Hướng dẫn doanh nghiệp: Lưu ý cảnh báo duy nhất là nếu bạn đang chạy nhiều mục mã trong cùng một phiên, bạn sẽ cần phải đặt lại các điều khoản lỗi ở đầu mỗi mục mã, vì sợ rằng các lỗi không liên quan sẽ ngừng hoạt động.

+0

Tôi nghĩ bạn có nghĩa là 'thay thế' chạy 'bằng' chạy và hủy '' trong câu đầu tiên –

3

Gần đây tôi đã sử dụng macro %runquit. Hoạt động tốt cho cả công việc theo lô và các phiên tương tác (không đóng phiên của bạn, chỉ dừng chạy mã).

Nguồn: http://www.cpc.unc.edu/research/tools/data_analysis/sas_to_stata/sas-macros/runquit.html

Để sử dụng nó về cơ bản bạn gõ %runquit; ở phần cuối của bất cứ bước nào dữ liệu hoặc PROC thay vì gõ đều đặn run hoặc quit tuyên bố của bạn.

Code:

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

sử dụng Datastep:

data something; 
* do some stuff; 
%runquit; 

sử dụng PROC:

proc sql; 
    * do some stuff; 
%runquit; 

Nó không phải là khá đẹp khi đọc qua mã, nhưng nó làm cho gỡ lỗi rất nhiều dễ dàng hơn.

2

Như bổ sung cho Rwill của câu trả lời:

Nếu bạn đang sử dụng một quá trình lưu trữ (STP), nó cũng tốt đẹp để không hiển thị nhật ký cho người dùng khi một lỗi xảy ra và để loại bỏ các "Show SAS log" nút .

Đó có thể đạt được với nguồn

%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; 

này: http://support.sas.com/kb/16/225.html

Và đây là một phiên bản nâng cao mà tôi thực hiện để vẫn hiển thị các lỗi trong định dạng 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; 

và HTML phiên bản:

%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

Rất đẹp! Có lẽ bạn cũng muốn một '% abort' hoặc' endsas; 'trong đó, vì vậy phần còn lại của chương trình không chạy không cần thiết? –

+0

@AllanBowe Điều này không yêu cầu '% checkErrors' rất thường xuyên trong chương trình của bạn? Tôi chỉ đang đặt '% checkErrors' vào cuối STP, vì vậy tôi không chắc chắn sẽ hữu ích khi hủy bỏ nữa. Bạn nghĩ sao? –

+0

chính xác, nếu ở cuối chương trình thì không cần hủy bỏ. Chỉ cần suy nghĩ về một số trường hợp sử dụng của riêng tôi (dài STP chạy), nơi nó sẽ được thuận tiện để có thể hủy bỏ ở giữa của một chương trình mà không gửi lỗi cho khách hàng. –

Các vấn đề liên quan