A SAS le gusta continuar el proceso bien después de advertencias y errores, por lo que a menudo necesito desplazarme hacia atrás en las páginas del registro para encontrar un problema. ¿Hay una mejor manera? Me gustaría que se detenga tan pronto como aparezca el primer error o advertencia para que pueda solucionarlo y vuelva a intentarlo.¿Hay alguna manera de hacer que SAS se detenga con la primera advertencia o error?
Respuesta
La opción ERRORES = 1 se sugirió anteriormente, pero eso solo detiene la escritura de los mensajes ERROR en el registro. Sugeriría otra opción del sistema, ERRORABEND, que evitará que el programa siga procesando la mayoría de los errores. No conozco una opción para finalizar el procesamiento debido a las advertencias, pero creo que podría agregar una macro como la siguiente para detener el procesamiento.
%macro check_for_errors;
%if &syserr > 0 %then %do;
endsas;
%end;
%mend check_for_errors;
data test1;
<data step code>
run;
%check_for_errors;
Puede repetir la llamada a la macro después de cada etapa de su programa, y debe terminar en el punto de que el código de error es cualquier cosa menos 0.
Debería haber leído más sobre la opción ERRORES = ... eliminó mi respuesta y actualizó su respuesta –
¿Hay algo así como la opción ERRORABEND que no causa la desconexión del servidor SAS? Utilizo EG conectado a un servidor UNIX externo y si bien sería genial detener el procesamiento en el primer error, ERRORABEND cierra la conexión al servidor, lo que demora un tiempo en restablecerse en la siguiente ejecución. – orh
También puede verificar si '& syserrortext' no está vacío. Encuentro que esta variable se configura de manera más confiable que '& syserr'. –
frecuencia hago algo similar a RWill, pero envolver todo mi programa en una macro. Después de cada paso DATA, PROC SQL, PROC SORT, etc. Compruebo un código de error (& SYSERR o & SQLRC). Si no es cero, salto hasta el final.
Más detalles y código aquí: https://heuristically.wordpress.com/2012/02/09/return-codes-errors-sas/
no puedo usar endsas a causa de cómo el sistema de lotes de nuestra organización lleva a cabo programas independientes en una sola sesión de SAS RWill.
¡Esto es genial! Solo lea la entrada del blog y lo estoy probando. Durante años, me ha dejado estupefacto que SAS no funcione de esta manera automáticamente. Pregunta rápida: ¿TENGO que usar la variable SQLRC al verificar errores PROC SQL, o solo si me preocupa recuperar el código de error SQL? Parece que SYSERR también funciona con PROC SQL pero quería verificarlo dos veces. ¡Gracias de nuevo! –
@sparc_spread: Si no le importa manejar el error en PROC SQL, entonces no verifique el código de error. Un caso donde puedo pensar que esto puede ser útil es usar 'drop table foo;' y no importa si la tabla existe. – Andrew
Impresionante, gracias de nuevo. –
Una opción es reemplazar run
con run &g_cancel
, y proc sql;
con proc sql &g_noexec;
. Inicialmente, &g_cancel
y &g_noexec
están desactivados, por lo que todo se ejecuta.
en golpear un error (ya sea %sys_rc
, %sql_rc
o el uso de referirse a la lógica de negocio) establece &g_cancel
para cancelar y &g_noexec
a noexec.
Esto debería evitar que se ejecuten los siguientes pasos: obviamente las variables macro se pueden omitir para los pasos que tienen que ejecutarse independientemente (por ejemplo, un tidy up) o verificar antes de realizar pasos puramente en macro.
Nota para los usuarios de Enterprise Guide: La única advertencia es que si está ejecutando múltiples elementos de código en la misma sesión tendrá que restablecer los términos de error al inicio de cada elemento de código, no sea que los errores no relacionados detengan el funcionamiento.
Creo que te refieres a 'reemplazar' ejecutar 'con' ejecutar y cancelar '' en la primera oración –
He estado usando la macro %runquit
recientemente. Funciona bien para trabajos por lotes y sesiones interactivas (no cierra la sesión, simplemente deja de ejecutar el código).
Fuente: http://www.cpc.unc.edu/research/tools/data_analysis/sas_to_stata/sas-macros/runquit.html
Para utilizarlo es básicamente escribir %runquit;
al final de cualquier paso de datos o PROC en lugar de escribir su habitual run
o quit
comunicado.
Código:
%macro runquit;
; run; quit;
%if &syserr. ne 0 %then %do;
%abort cancel;
%end;
%mend runquit;
uso Datastep:
data something;
* do some stuff;
%runquit;
uso PROC:
proc sql;
* do some stuff;
%runquit;
No es tan bonito cuando la lectura a través del código, pero sí hacer que la depuración de un montón más fácil.
Como complemento a la respuesta de Rwill:
Si está utilizando un proceso almacenado (STP), que es también muy agradable para no mostrar el registro a los usuarios cuando se produce un error y para eliminar el "registro Mostrar SAS" botón .
que se pueden lograr con esta fuente
%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
Y aquí es una versión mejorada que hice para mostrar aún el error en el formato 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;
y HTML versió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;
¡Muy bien! Es de suponer que también querría un '% abort' o' endsas; 'allí, para que el resto del programa no se ejecute innecesariamente? –
@AllanBowe ¿Esto no requeriría '% checkErrors' muy a menudo en su programa? Solo coloco '% checkErrors' al final del STP, así que no estoy seguro de que sea útil abortar más. ¿Qué piensas? –
correcto, si está al final del programa, entonces no es necesario abortar. Solo estoy pensando en términos de algunos de mis casos de uso (STP de larga ejecución) donde sería útil poder abortar en medio de un programa sin enviar errores al cliente. –
- 1. ¿Cómo puedo hacer que NetBeans no se detenga en la primera línea con xdebug?
- 2. ¿Hay alguna manera de hacer que TFS se pueda enlazar?
- 3. ¿Hay alguna manera de copiar/pegar los mensajes de error o advertencia de Xcode 4?
- 4. ¿Cómo hacer que grep se detenga en la primera coincidencia en una línea?
- 5. ¿Hay alguna manera de hacer que un ExecutorService funcione recursivamente?
- 6. ¿Hay alguna manera de desactivar la advertencia de drupal 7?
- 7. ¿Hay alguna manera de hacer que Guice Grapher trabaje?
- 8. git-svn: ¿hay alguna manera de hacer que funcione bien con los submódulos, o ignorarlos?
- 9. ¿Mejor manera de indicar que otro hilo se detenga?
- 10. ¿Hay alguna manera fácil de hacer que ScrollViewer sea "hinchable"?
- 11. ¿Hay alguna manera de hacer que UserControl sea inafocable?
- 12. ¿Hay alguna manera de hacer que un enlace se pueda hacer clic en el terminal OSX?
- 13. ¿Hay alguna manera de hacer que la unión de C# funcione de manera estática?
- 14. ¿Hay alguna manera de ignorar una sola advertencia FindBugs?
- 15. ¿Hay alguna manera en que pueda hacer que g ++ solo emita advertencias relacionadas con mis archivos?
- 16. Cómo hacer que las pruebas junit se detengan después de la primera prueba de falla
- 17. ¿Hay alguna manera de mostrar o lanzar una advertencia de PHP?
- 18. ¿Cómo puedo hacer que Visual Studio se rompa justo antes de que se detenga el programa?
- 19. ¿Cómo hacer que Xcode4 se detenga en NSAssert failure?
- 20. ¿Hay alguna manera de hacer que dos animaciones jQuery se ejecuten (correctamente) simultáneamente?
- 21. ¿Hay alguna manera de hacer que Visual Studio deje de sangrar espacios de nombres?
- 22. ¿Hay alguna manera de registrar o interceptar Excepciones de primera oportunidad
- 23. ¿Hay alguna manera de hacer que el ciclo jQuery no se repita al llegar al final o al principio?
- 24. ¿Hay alguna manera de hacer que FPDF/FPDI o Zend_Pdf admitan el análisis de archivos PDF mayores que 1.4?
- 25. Advertencias de PHP provocan que la secuencia de comandos se detenga en IIS que ejecuta FastCGI
- 26. ¿Hay alguna manera de hacer esta búsqueda hash más rápido?
- 27. ¿Hay alguna manera de hacer que el tipo `enum` no esté firmado?
- 28. ¿Hay un término para una máquina de estado finito que se garantiza que se detenga?
- 29. ¿Hay alguna manera de hacer que python se convierta en interactivo en medio de un script?
- 30. ¿Hay alguna manera de detectar si la aplicación se instaló con Market o no?
veo que SO responde preguntas acerca de la programación SAS: la migración de allí. – whuber