Proceso de control de procesos no distrital
Algunos lenguajes de programación proporcionarán un flujo de control no local, lo que permitirá que el proceso salte del código actual e ingrese un código preespecificado. Los procesos de control no parcial estructurados de uso común se pueden dividir en tres tipos: procesamiento de condiciones (condición), procesamiento de excepciones y continuación (Continuación). Hay 22 condiciones estándar (como ZERODIVIDE SUBSCRIPTRANGE ENDFILE) en el lenguaje de programación PL/I, que se pueden configurar en el programa. Los programadores también pueden definir sus propias condiciones y usarlas en el programa.
Cuando se establece la condición, solo puede configurar una instrucción para que se ejecute (similar a la instrucción if no estructurada, en la mayoría de las aplicaciones, se especificará la instrucción goto para ejecutar y saltar a otros códigos para ejecutar). el proceso correspondiente.
Sin embargo, debido a que la implementación de algún procesamiento condicional aumentará una gran cantidad de código y tiempo de ejecución (especialmente SUBSCRIPTRANGE), muchos programadores intentarán no utilizar el procesamiento condicional.
La sintaxis para el procesamiento condicional es la siguiente:
ON etiqueta GOTO condicional Algunos lenguajes de programación pueden proporcionar controladores de excepciones estructurados que no requieren el uso de GOTO: try{xxx1/ /Somewhereinherexxx2//use: '''throw'''someValue;xxx3}catch(someClassamp;someId){//catchvalueofsomeClassactionForSomeClass}catch(someTypeamp;anotherId){//catchvalueofsomeTypeactionForSomeType}catch(...){//catchanythingnotalreadycaughtactionForAnythingElse} en el bloque try{... }, si hay una excepción, el programa abandonará el bloque try y una o más cláusulas catch posteriores determinarán qué tipo de manejo de excepciones se debe ejecutar. En los lenguajes de programación D, Java, C# y Python, también se puede agregar una cláusula finalmente al bloque try{...} Independientemente de si el flujo del programa abandona el bloque try{...}, el programa en la cláusula finalmente. Definitivamente se ejecutará. A menudo se usa cuando es necesario abandonar algunos recursos externos (archivos o enlaces de bases de datos) cuando el programa sale del procesamiento: FileStreamstm=null; //C#exampletry{stm=newFileStream(logfile.txt, FileMode. Create); returnProcessStuff(stm);//maythrowanexception}finally{if(stm!=null)stm.Close();} Dado que la situación anterior es bastante común, C# proporciona una sintaxis especial para el mismo procesamiento: usando(FileStreamstm= newFileStream(logfile .txt, FileMode.Create)) {returnProcessStuff(stm); //maythrowanexception} Siempre que abandone el bloque de uso, el compilador liberará automáticamente el objeto stm con instrucciones que también tienen una función similar.
Estos lenguajes han definido situaciones de excepción estándar y las condiciones bajo las cuales ocurren. Los programadores también pueden lanzar sus propias excepciones (de hecho, el lanzamiento y la captura de C y Python admiten la mayoría de las formas de objetos).
Si una determinada instrucción de lanzamiento no puede encontrar la captura correspondiente, el flujo de control abandonará la subrutina o estructura de control actual e intentará encontrar la captura correspondiente si la captura correspondiente aún no se encuentra al final de la. programa principal, el programa se cerrará forzosamente y mostrará un mensaje de error apropiado.
El lenguaje de script AppleScript puede dividir el bloque try en varias partes para proporcionar diferente información y excepciones: trysetmyNumbertomyNumber/0onerrorenumbernfromftotpartialresultprif(e=Can'tdividebyzero)thedisplaydialogYouidiot!endtry La continuación puede cambiar el estado de ejecución actual del subprograma (incluida la pila actual, las variables de área y la ubicación hacia la que se ejecuta) se almacena como un objeto. Este objeto se puede utilizar en otros subprogramas para volver al estado de ejecución actual de este subprograma.
El término continuación también puede referirse a una continuación de primera clase, lo que significa que un lenguaje de programación puede almacenar el estado de ejecución actual en cualquier momento y luego volver al estado de ejecución previamente almacenado.
El programa necesita asignar espacio para las variables de área utilizadas por la subrutina, y el espacio utilizado por estas variables debe liberarse cuando la subrutina sale. Muchos lenguajes de programación utilizan la pila de llamadas para almacenar estas variables, lo que permite una asignación y liberación de espacio fácil y rápida. También existen algunos lenguajes de programación que utilizan la asignación de memoria dinámica para almacenar variables, lo que puede asignar variables de manera más flexible, pero es más inconveniente asignar y liberar espacio. La forma en que se maneja la continuidad bajo estas dos arquitecturas también será diferente, cada una con sus propias ventajas y desventajas.
El lenguaje Scheme utiliza la función de llamada con continuación actual (abreviada como llamada/cc) para proporcionar funciones de continuación.