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?
Trả lời
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.
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 –
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
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'. –
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.
Đ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! –
@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
Tuyệt vời, cảm ơn một lần nữa. –
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
và &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.
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 –
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.
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;
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? –
@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? –
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. –
- 1. "bắt đầu trước mục tiêu đầu tiên. Dừng lại". lỗi
- 2. Dừng về lỗi đầu tiên
- 3. Làm cách nào để yêu cầu Boost.Test dừng lại trong trường hợp kiểm tra lỗi đầu tiên?
- 4. Làm cách nào để kiểm tra junit dừng sau lần kiểm tra lỗi đầu tiên
- 5. Làm cách nào để dừng tập lệnh PowerShell trên lỗi đầu tiên?
- 6. trong khi grep nhiều tệp, làm thế nào để dừng sau khi kết hợp đầu tiên?
- 7. Làm cách nào để trả lại biến chuỗi đầu tiên không rỗng hoặc rỗng
- 8. Trình biên dịch gcc không dừng lại trên lỗi đầu tiên
- 9. Làm cách nào để tổng hợp ngắt dòng trong GNU Tạo cảnh báo hoặc lỗi?
- 10. Bất kỳ cách nào để làm cho chu kỳ jQuery không lặp lại khi đạt đến kết thúc hoặc đầu?
- 11. Có cú pháphighlighter nào cho SAS không?
- 12. Làm cách nào để NetBeans không dừng ở dòng đầu tiên với xdebug?
- 13. Làm cho một gcc cảnh báo lỗi?
- 14. Có cảnh báo JavaScript không tạm dừng tập lệnh không?
- 15. Dừng xác thực trên cờ lỗi đầu tiên trong Symfony2?
- 16. Làm cách nào để tạm dừng thông báo lỗi vim khi khởi chạy?
- 17. Khuôn khổ mũi Python: Cách dừng thực hiện khi lỗi đầu tiên
- 18. iOS - UIActivityIndicator gây ra cảnh báo "Ẩn khi bị dừng nhưng không ẩn hoặc hoạt ảnh"
- 19. Làm cách nào để tải lại trang mà không có cảnh báo POSTDATA trong Javascript?
- 20. Làm thế nào tôi có thể thông báo cho sqlalchemy để tăng lỗi khi MySQL ném cảnh báo?
- 21. Làm cách nào để ghi lại các lỗi và cảnh báo vào một tệp?
- 22. Làm cách nào để tự động dừng gỡ lỗi khi bắt đầu chỉnh sửa mã?
- 23. Grep chỉ là trận đấu đầu tiên và dừng lại
- 24. Làm cách nào để tạo lỗi hoặc cảnh báo trong bộ tiền xử lý C?
- 25. Làm cách nào để tắt "cảnh báo là lỗi" cho các tệp được tạo? (MSBuild)
- 26. VS2010 - Cách tự động dừng biên dịch trên lỗi biên dịch đầu tiên
- 27. Làm cách nào để hiển thị cảnh báo sau khi tải lại trang bằng JavaScript?
- 28. Làm thế nào để dừng gỡ lỗi (hoặc tách quy trình) mà không dừng quá trình?
- 29. Làm cách nào để dừng EF (Mã đầu tiên) Kiểm tra các thay đổi lược đồ
- 30. Làm cách nào để tạm dừng vẽ lại trong XNA?
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