La sintaxis de manejo de excepciones es el conjunto de palabras clave y/o estructuras que proporciona un lenguaje de programación para permitir el manejo de excepciones , lo que separa el manejo de errores que surgen durante la ejecución de un programa de sus procesos ordinarios. La sintaxis para el manejo de excepciones varía entre los lenguajes de programación , en parte para cubrir diferencias semánticas, pero principalmente para adaptarse a la estructura sintáctica general de cada lenguaje . Algunos lenguajes no denominan a este concepto " manejo de excepciones "; otros pueden no tener funcionalidades directas para ello, pero aun así pueden proporcionar medios para implementarlo.
Lo más habitual es que el manejo de errores utilice un try...[catch...][finally...]bloque, y que los errores se creen mediante una throwinstrucción, pero existe una variación significativa en la nomenclatura y la sintaxis.
Catálogo de sintaxis para el manejo de excepciones
Ada
- Declaraciones de excepciones
Some_Error : excepción ;- Generar excepciones
generar algún_error ;Generar Some_Error con "Memoria insuficiente" ; -- mensaje de diagnóstico específico- Manejo y propagación de excepciones
con Ada.Exceptions , Ada.Text_IO ;procedure Foo is Some_Error : exception ; begin Do_Something_Interesting ; exception -- Inicio de los manejadores de excepciones when Constraint_Error => ... -- Manejar el error de restricción when Storage_Error => -- Propagar Storage_Error como una excepción diferente con un mensaje útil raise Some_Error with "Sin memoria" ; when Error : others => -- Manejar todos los demás Ada . Text_IO . Put ( "Excepción: " ); Ada . Text_IO . Put_Line ( Ada . Exceptions . Exception_Name ( Error )); Ada . Text_IO . Put_Line ( Ada . Exceptions . Exception_Message ( Error )); end Foo ;lenguaje ensamblador
La mayoría de los lenguajes ensamblador disponen de una macroinstrucción o una dirección de interrupción para que el sistema intercepte eventos como códigos de operación no válidos, comprobaciones de programa, errores de datos, desbordamiento, división por cero , etc. Los mainframes de IBM y UNIVAC contaban con la macro STXIT . Los sistemas RT11 de Digital Equipment Corporation tenían vectores de interrupción para errores de programa, interrupciones de E/S, etc. DOS dispone de ciertas direcciones de interrupción. Microsoft Windows tiene llamadas a módulos específicos para interceptar errores de programa.
ATS
excepción MyException de ( cadena , entero ) (* las excepciones pueden contener un valor *)implement main0 () : void = try $ raise MyException ( "not enough food" , 2 ) with | ~ MyException ( s , i ) => begin $ extfcall ( void , "fprintf" , stderr_ref , "%s: %d" , s , i ); fileref_close ( stderr_ref ); endIntento
#!/usr/bin/env bash #set -e proporciona otro mecanismo de error print_error () { echo "hubo un error" } trap print_error exit #lista de señales para capturar tempfile = ` mktemp ` trap "rm $tempfile " exit ./other.sh || echo advertencia: other falló echo oops ) echo nunca se imprimió Se puede configurar una trampa para múltiples errores, respondiendo a cualquier señal con una sintaxis como:
trap'echo Error at line ${LINENO}'ERR
BÁSICO
En BASIC se utiliza una estructura goto/gosub en caso de error , que es bastante diferente del manejo de excepciones moderno; en BASIC solo hay un manejador global, mientras que en el manejo de excepciones moderno, los manejadores de excepciones se apilan.
ON ERROR GOTO handler OPEN "Somefile.txt" FOR INPUT AS # 1 CLOSE # 1 PRINT "Archivo abierto correctamente" ENDmanejador: PRINT "El archivo no existe" END ' Se puede usar RESUME en su lugar, que devuelve el control a la posición original.do
C no proporciona soporte directo para el manejo de excepciones: es responsabilidad del programador prevenir errores desde el principio y comprobar los valores de retorno de las funciones.
En cualquier caso, una forma posible de implementar el manejo de excepciones en C estándar es usar las funciones setjmp() / longjmp() :
#include <setjmp.h> #include <stdio.h> #include <stdlib.h>enum Excepción { NoExceptionThrown = 0 , OutOfBoundsException = 1 , ArithmeticException = 2 , // ... } GLOBAL_EXCEPTION_STATE ;estado de jmp_buf ;int main ( void ) { // try if ( ! setjmp ( state )) { // código que manipula 'GLOBAL_EXCEPTION_STATE' if ( GLOBAL_EXCEPTION_STATE != NoExceptionThrown ) { longjmp ( state , 0 ); // ir a la captura de excepciones... } } else { switch ( GLOBAL_EXCEPTION_STATE ) { // catch (OutOfBoundsException) case OutOfBoundsException : printf ( "OutOfBoundsException capturada" ); break ; // catch (ArithmeticException) case ArithmeticException : printf ( "ArithmeticException capturada" ); break ; // casos catch adicionales... default : // catch (...) printf ( "Excepción desconocida capturada" ); } } return EXIT_SUCCESS ; }Específico de Microsoft
Existen dos tipos:
- Manejo estructurado de excepciones (SEH)
- Manejo de excepciones vectorizadas (VEH, introducido en Windows XP )
Ejemplo de SEH en lenguaje de programación C :
int filterExpression ( EXCEPTION_POINTERS * ep ) { ep -> ContextRecord -> Eip += 8 ; // la instrucción de división puede estar codificada de 2 a 8 bytes return EXCEPTION_CONTINUE_EXECUTION ; }int main ( void ) { static int zero = 0 ; __try { zero = 1 / zero ; asm { nop nop nop nop nop nop nop } printf ( "Se pasó la excepción. \n " ); } __except ( filterExpression ( GetExceptionInformation ())) { printf ( "Se llamó al manejador. \n " ); } return 0 ; }DO#
Un trybloque debe tener al menos una cláusula catchOR finallyy como máximo una finallycláusula.
espacio de nombres Wikipedia.Ejemplos ;using System ; using System.Web ;public class Example { static void Main () { try { // Código que podría lanzar una excepción. } catch ( HttpException ex ) { // Maneja una HttpException (System.Web.HttpException). // El objeto de excepción se almacena en "ex". } catch ( Exception ) { // Maneja cualquier excepción CLR que no sea una HttpException. // Como a la excepción no se le ha dado un identificador, no se puede hacer referencia a ella. } catch { // Maneja cualquier cosa que pueda lanzarse, incluidas las excepciones que no son CLR. } finally { // Siempre se ejecuta al salir del bloque try (incluidas las cláusulas catch), independientemente de si se lanzaron excepciones o si se manejaron. // A menudo se usa para limpiar y cerrar recursos como los identificadores de archivo. // Puede que no se ejecute cuando se llama a Environment.FailFast() y en otras condiciones excepcionales de todo el sistema (por ejemplo, pérdida de energía), o cuando el proceso falla debido a una excepción en otro hilo. } } }C++
importar std ;using std :: exception ; using std :: runtime_error ;int main () { try { // hacer algo (podría lanzar una excepción) mightThrow (); } catch ( const runtime_error e ) { // manejar un runtime_error e } catch ( const exception & e ) { // captura todas las excepciones como e } catch (...) { // captura todos los tipos lanzados (incluidos los primitivos u objetos que no extienden exception), que no hayan sido capturados previamente por un bloque catch } }En C++, se puede utilizar una técnica de adquisición de recursos para inicializar y limpiar recursos en situaciones excepcionales. C++ intencionalmente no admite finally. [ 1 ] Las llaves exteriores para el método son opcionales.
Lenguaje de marcado ColdFusion (CFML)
Sintaxis del script
<cfscript> try { //throw CF9+ throw ( type = "TypeOfException" , message = " Oops" , detail = "xyz" ); // sintaxis alternativa de throw: throw "Oops" ; // esto es equivalente al valor "message" en el ejemplo anterior } catch ( any e ) { writeOutput ( " Error: " & e . message ); rethrow ; //CF9+ } finally { //CF9+ writeOutput ( "Me ejecuto incluso si no hay error" ); } < /cfscript>Documentación de Adobe ColdFusion [ 2 ]
Sintaxis de etiquetas
<cftry> código que puede causar una excepción <cfcatch ... > <cftry> Código de manejo de excepciones de primer nivel <cfcatch ... > Código de manejo de excepciones de segundo nivel </cfcatch> < cffinally > código final </cffinally> </cftry> </cfcatch> </cftry>Documentación de Adobe ColdFusion [ 3 ]
Sintaxis específica de Railo-Lucee
Además de la sintaxis estándar anterior, los dialectos CFML de Railo y Lucee permiten una retryinstrucción. [ 4 ]
Esta instrucción devuelve el procesamiento al inicio del trybloque anterior.
try { // código que podría generar una excepción } catch ( any e ){ reintentar ; }Ejemplo de sintaxis de etiquetas:
<cftry><!--- código que podría generar una excepción ---><cfcatch> <cftry> </cfcatch> </cftry>D
import std.stdio ;int main () { try { // hacer algo que podría lanzar una excepción } catch ( FileException e ) { // manejar excepciones de tipo FileException } catch ( Object o ) { // manejar cualquier otra excepción writefln ( "Excepción no manejada: " , o ); return 1 ; } return 0 ; }En D, se puede utilizar una finallycláusula o la técnica de inicialización de adquisición de recursos para limpiar recursos en situaciones excepcionales.
Delfos
- Declaraciones de excepciones
type ECustom = class ( Exception ) // Las excepciones son hijas de la clase Exception. private FCustomData : SomeType ; // Las excepciones pueden tener extensiones personalizadas. public constructor CreateCustom ( Data : SomeType ) ; // Necesita una propiedad de implementación CustomData : SomeType read FCustomData ; end ;- Generar excepciones
generar excepción.Crear ( ' Mensaje ' ) ;raise Exception . CreateFmt ( 'Mensaje con valores: %d, %d' , [ valor1 , valor2 ]) ; // Consulte SysUtils.Format() para ver los parámetros.generar ECustom.CreateCustom ( X ) ;- Manejo y propagación de excepciones [ 5 ]
try // Para finally. try // Para except. ... // Código que puede generar una excepción. except on C : ECustom do begin ... // Manejar ECustom. ... if Predicate ( C . CustomData ) then ... end ; on S : ESomeOtherException do begin // Propagar como otra excepción. raise EYetAnotherException . Create ( S . Message ) ; end ; on E : Exception do begin ... // Manejar otras excepciones. raise ; // Propagar. end ; end ; finally // Código a ejecutar independientemente de si se genera o no una excepción (por ejemplo, código de limpieza). end ;Erlang
try % algún código peligroso catch throw :{ someError , X } -> ok ; % manejar una excepción error : X -> ok ; % manejar otra excepción _:_ -> ok % manejar todas las excepciones después de % limpiar endF#
Además de la basada en OCaml try...with, F# también tiene la try...finallyconstrucción separada, que tiene el mismo comportamiento que un bloque try con una finallycláusula en otros lenguajes .NET.
A modo de comparación, esta es una traducción del ejemplo en C# anterior .
try try () (* Código que podría lanzar una excepción. *) with | :? System . Net . WebException as ex -> () (* Maneja una WebException. El objeto de excepción se almacena en "ex" . *) | :? exn -> () (* Maneja cualquier excepción CLR. Como a la excepción no se le ha dado un identificador, no se puede hacer referencia a ella. *) | _ -> () (* Maneja cualquier cosa que pueda lanzarse, incluidas las excepciones que no son CLR. *) finally () (* Siempre se ejecuta al salir del bloque try, independientemente de si se lanzaron excepciones o si se manejaron. A menudo se usa para limpiar y cerrar recursos como los identificadores de archivos. Puede que no se ejecute cuando se llama a Environment.FailFast() y en otras condiciones excepcionales de todo el sistema (por ejemplo, pérdida de energía), o cuando el proceso falla debido a una excepción en otro hilo. *)A modo de comparación, esta es la traducción del ejemplo de OCaml que aparece a continuación .
excepción MyException de cadena * int (* las excepciones pueden llevar un valor *) let _ = try raise ( MyException ( "not enough food" , 2 )); printfn "No alcanzado" con | MyException ( s , i ) -> printf "MyException: %s, %d \n " s i | e -> (* capturar todas las excepciones *) eprintf "Excepción inesperada: %O" e ; eprintf "%O" e . StackTraceHaskell
Haskell no tiene una sintaxis especial para excepciones. En su lugar, las funciones proporcionan una interfaz try// .catchfinallyetc
import Prelude hiding ( catch ) import Control.Exception instance Exception Int instance Exception Double main = do catch ( catch ( throw ( 42 :: Int )) ( \ e -> print ( 0 , e :: Double ))) ( \ e -> print ( 1 , e :: Int ))huellas dactilares
(1,42)
en analogía con este C++
importar std ;int main () { try { throw static_cast <int> ( 42 ) ; } catch ( double d ) { std :: println ( " (0,{})" , d ); } catch ( int i ) { std :: println ( "(1,{})" , i ); } }Otro ejemplo es
do { -- Instrucciones en las que podrían producirse errores } ` catch ` \ ex -> do { -- Instrucciones que se ejecutan en caso de excepción, con 'ex' vinculado a la excepción }En código puramente funcional, si solo existe una condición de error, el Maybetipo puede ser suficiente y, por defecto, es una instancia de la clase de Haskell . Se puede lograr una propagación de errores más compleja utilizando las mónadas o , para las cuales se admite una funcionalidad similar (usando ).MonadErrorErrorT`catch`
Java
Un trybloque debe tener al menos una cláusula catchor y como máximo una cláusula. Java distingue entre (errores razonables de capturar) y (errores, generalmente más graves, irrazonables de capturar), ambos descendientes de (la clase base de cualquier objeto que pueda ser lanzado).finallyfinallyExceptionsErrorThrowable
paquete org.wikipedia.examples ;import java.io.IOException ;public class Example { public static void main ( String [] args ) { try { // Ruta de ejecución normal. mayThrowIOException (); // método que puede lanzar una IOException } catch ( IOException e ) { // Manejar la IOException. // IOException es una excepción verificada que debe ser capturada. } catch ( RuntimeException e ) { // Manejar la RuntimeException. // Las excepciones de tiempo de ejecución no son verificadas y no se obliga a capturarlas. } catch ( Exception e ) { // Captura cualquier cosa que sea una instancia de Exception } catch ( Throwable t ) { // Captura cualquier cosa que sea una instancia de Throwable (incluyendo Exception y Error) } finally { // Siempre se ejecuta al salir del bloque try (incluyendo las cláusulas finally), independientemente de si se lanzaron excepciones o si se manejaron. // Limpia y cierra los recursos adquiridos en el bloque try. // Puede que no se ejecute cuando se llama a System.exit() y en otras condiciones excepcionales de todo el sistema (por ejemplo, pérdida de energía). // Se usa raramente después de que se agregó try-with-resources al lenguaje (ver más abajo). } } }Si se adquieren varios recursos, la forma correcta de manejarlos es con bloques try anidados. [ 6 ] Por esta razón y otras, se agregó try-with-resources al lenguaje para reemplazar casi por completo las cláusulas finally. Los recursos adquiridos entre paréntesis después de la palabra clave try se limpiarán automáticamente. Las clases utilizadas en estas instrucciones deben implementar una interfaz llamada java.lang.AutoCloseable. [ 7 ] Esto es similar al patrón " la adquisición de recursos es la inicialización " común en lenguajes como C++ , donde los recursos se limpian después de salir del ámbito.
paquete org.wikipedia.examples ;import java.io.BufferedReader ; import java.io.FileReader ; import java.io.IOException ;public class Example { public static void main ( String [] args ) { try ( FileReader fr = new FileReader ( path ); BufferedReader br = new BufferedReader ( fr )) { // Ruta de ejecución normal. } catch ( IOException e ) { // Manejar la excepción. // Los recursos en la instrucción try se cierran automáticamente después. } finally { // Se puede incluir una cláusula finally, que se ejecutará después de que se cierren los recursos en las instrucciones try. } } }JavaScript
El diseño de JavaScript hace que los errores graves sean muy poco comunes. Los errores leves son mucho más frecuentes. Los errores graves se propagan a la tryinstrucción más cercana, que debe ir seguida de una catchcláusula simple, una finallycláusula simple o ambas.
try { // Instrucciones en las que podrían lanzarse excepciones throw new Error ( "error" ); } catch ( error ) { // Instrucciones que se ejecutan en caso de excepción } finally { // Instrucciones que se ejecutan posteriormente de cualquier forma }Si no hay tryninguna instrucción, la página web no se bloquea. En su lugar, se registra un error en la consola y se borra la pila. Sin embargo, JavaScript tiene la peculiaridad de los puntos de entrada asíncronos invocados externamente. Mientras que en la mayoría de los demás lenguajes siempre hay alguna parte del código ejecutándose, JavaScript no tiene por qué ejecutarse linealmente de principio a fin. Por ejemplo, el navegador puede invocar detectores de eventos, promesas y temporizadores posteriormente, ejecutándolos en un contexto aislado pero compartido con el resto del código. Observe cómo el siguiente código generará un nuevo error cada 4 segundos durante un período de tiempo indefinido o hasta que se cierre el navegador, la pestaña o el ordenador.
setInterval ( function () { throw new Error ( "Ejemplo de un error lanzado en un intervalo de 4 segundos." ); }, 4000 );Otra peculiaridad interesante es el polimorfismo: JavaScript puede generar errores al generar valores primitivos.
try { throw 12345 ; // número primitivo } catch ( error ) { console.log ( error ); // registra 12345 como un número primitivo en la consola }Tenga en cuenta que la catchcláusula es una cláusula comodín que abarca todo tipo de errores. No existe la posibilidad sintáctica de asignar diferentes manejadores a distintos tipos de errores, salvo en las extensiones experimentales de Gecko, actualmente eliminadas, que datan de hace muchos años. En su lugar, se puede propagar el error mediante una throwinstrucción anidada catcho utilizando múltiples casos condicionales. Comparemos un ejemplo en Java con sus equivalentes aproximados en JavaScript.
// Ejemplo en Java try { Integer i = null ; i . intValue (); // lanza una NullPointerException } catch ( NullPointerException error ) { // La variable podría ser nula } catch ( ArithmeticException error ) { // Manejar problemas con números }// Aproximación n . ° 1 en JavaScript try { // Instrucciones en las que se pueden lanzar excepciones let example = null ; example.toString (); } catch ( error ) { if ( error.type === " TypeError" ) { // La variable podría ser nula } else if ( error.type === "RangeError" ) { // Manejar problemas con números } }// Aproximación n . ° 2 en JavaScript try { try { // Instrucciones en las que se pueden lanzar excepciones let example = null ; example.toString (); } catch ( error ) { if ( error.type ! == " TypeError" ) throw error ; // La variable podría ser nula } } catch ( error ) { if ( error.type !== "RangeError" ) throw error ; // Manejar problemas con números }Otro aspecto de las excepciones son las promesas, que las gestionan de forma asíncrona. La ventaja de gestionar las excepciones de forma asíncrona es que los errores dentro del gestor de errores no se propagan hacia afuera.
nueva Promise ( función () { throw new Error ( "¡Error de ejemplo!" ); }). catch ( función ( err ) { console . log ( "Capturado " , err ); });Observe también cómo los manejadores de eventos pueden vincularse con las promesas.
addEventListener ( " unhandledrejection" , function ( event ) { console.log ( event.reason ) ; event.preventDefault ( ); // Evita que se registre el error mediante console.error en la consola (el comportamiento predeterminado ) });nueva Promesa ( función () { lanzar nuevo Error ( "¡Error de ejemplo!" ); });Por último, cabe destacar que, dado que JavaScript utiliza la recolección de basura de marcado y barrido, nunca se produce ninguna fuga de memoria a partir de las sentencias throw, ya que el navegador limpia automáticamente los objetos muertos , incluso con referencias circulares.
try { // Instrucciones en las que podrían lanzarse excepciones const obj = {}; obj . selfPropExample = obj ; // referencia circular throw obj ; } catch ( error ) { // Instrucciones que se ejecutan en caso de una excepción }Mecanografiado
En TypeScript , catchlos bloques no pueden especificar tipos, pero esto se hace tradicionalmente usando instanceof.
try { // ... } catch ( e ) { if ( e instanceof TypeError ) { // manejar errores de tipo TypeError } else if ( e instanceof SyntaxError ) { // manejar errores de tipo SyntaxError } else if ( e instanceof Error ) { // manejar errores que extienden Error } else { // manejar cualquier objeto lanzado } } finally { // ... }Kotlin
La sintaxis para el manejo de errores en Kotlin es muy similar a la de Java.
try { // Código que puede lanzar una excepción } catch ( e : ArithmeticException ) { // Código para manejar una kotlin.ArithmeticException // (se traduce a java.lang.ArithmeticException) } catch ( e : Exception ) { // Captura cualquier cosa que extienda kotlin.Exception // (se traduce a java.lang.Exception) } catch ( t : Throwable ) { // Captura cualquier cosa que extienda kotlin.Throwable // (se traduce a java.lang.Throwable) } finally { // Cláusula finally }Kotlin no obliga a capturar excepciones verificadas, pero aún puede obligar a quienes llaman a Java a capturar/declarar la excepción verificada.
@Throws ( IOException :: class ) fun readFile () { // ... throw IOException ( "¡Error al leer el archivo!" ) }// se traduce en // public static void readFile() throws IOException; // en la JVMKotlin admite tryexpresiones:
val result : Int = try { "123" . toInt () // el resultado obtiene 123 } catch ( e : NumberFormatException ) { - 1 // el resultado obtiene -1 }Ceceo
Lisp común
( ignorar-errores ( / 1 0 ))( handler-case ( progn ( print "ingrese una expresión" ) ( eval ( read ))) ( error ( e ) ( print e )))( unwind-protect ( progn ( print "Introduzca una expresión" ) ( eval ( read ))) ( print "Esta impresión siempre se ejecutará, de forma similar a finally." ))Lua
Lua utiliza las funciones pcally , donde toma una función para actuar como un bloque.xpcallxpcallcatch
- Función predefinida
función foo ( x ) si x entonces devolver x sino error "No es un valor verdadero" fin finfunción intento ( arg ) éxito , valor = pcall ( foo , arg )Si no se produce éxito , imprime " Error: " .. tostring ( valor )); de lo contrario, imprime " Devuelto: " .. tostring ( valor )); fin .intento ( "hola" ) -- Devuelto: holaintento ( nil ) -- Error: stdin:5: No es un valor verdaderointento ({}) -- Devuelto: tabla: 00809308 si foo ( 42 ) entonces imprimir "Éxito" fin -- Éxito- Función anónima
if pcall ( function () -- Realizar alguna acción que podría generar un error. end ) then print "No hay errores" -- Se ejecuta si la llamada protegida fue exitosa. else print "Se produjo un error" -- Se ejecuta si la llamada protegida falló. endImprimir "Hecho" -- Siempre se ejecutaráShell de próxima generación
- Definición de un tipo de excepción personalizado
tipo MyError ( Error )- Generar excepciones
lanzar MyError ( "esto sucedió" )- Manejo y propagación de excepciones
try { # algo } catch ( e : MyError ) { guard e . val = 7 # ... } catch ( e : MyError ) { # ... } catch ( e : Error ) { # ... }- Ignorar excepciones: intentar sin captura
intentar 1 / 0 # se evalúa como nulo- Ignorar excepciones - operador "tor"
"tor" es el operador try-or. En caso de que se produzca alguna excepción al evaluar el argumento de la izquierda, se evalúa al argumento de la derecha.
1 / 0 para 20 # se evalúa a 20- "bloquear": mecanismo para usar excepciones para devolver un valor.
mi_resultado = bloque mi_bloque { # "bloque" captura la excepción lanzada por return a continuación # realizar cálculo si cálculo_terminado () { mi_bloque . return ( 42 ) # lanza excepción } }Objetivo-C
- Declaraciones de excepciones
NSException * excepción = [ NSException excepciónWithName : @"myException" razón : @"yourReason" userInfo : nil ];- Generar excepciones
@throw exception ;- Manejo y propagación de excepciones
@try { ... } @catch ( SomeException * se ) { // Manejar un tipo de excepción específico. ... } @catch ( NSException * ne ) { // Manejar excepciones generales. ...// Propaga la excepción para que se maneje en un nivel superior. @throw ; } @catch ( id ue ) { // Captura todos los objetos lanzados. ... } @finally { // Realiza la limpieza, independientemente de si ocurrió una excepción o no. ... }OCaml
excepción MyException de cadena * int (* las excepciones pueden llevar un valor *) let _ = try raise ( MyException ( "not enough food" , 2 )); print_endline "No alcanzado" con | MyException ( s , i ) -> Printf . printf "MyException: %s, %d \n " s i | e -> (* capturar todas las excepciones *) Printf . eprintf "Excepción inesperada: %s" ( Printexc . to_string e ); (*Si se utiliza Ocaml >= 3.11, también es posible imprimir un rastreo de pila: *) Printexc . print_backtrace stderr ; (* Es necesario habilitar previamente la grabación del rastreo de pila con Printexc.record_backtrace true o configurando la variable de entorno OCAMLRUNPARAM="b1"*)Perl 5
El mecanismo de Perl para el manejo de excepciones utiliza dielanzar una excepción cuando está envuelto dentro de un bloque. Después del , la variable especial contiene el valor pasado desde .eval{...};eval$@die
Perl 5.005 añadió la capacidad de lanzar objetos además de cadenas. Esto permite una mejor introspección y manejo de los diferentes tipos de excepciones.
eval { open ( FILE , $file ) || die MyException::File -> new ( $! ); while ( <FILE> ) { process_line ( $_ ); } close ( FILE ) || die MyException::File -> new ( $! ); }; if ( $@ ) { # El objeto de excepción está en $@ if ( $@ -> isa ( 'MyException::File' )) { # Manejar excepción de archivo } else { # Manejo genérico de excepciones # o relanzar con 'die $@' } }La __DIE__pseudoseñal puede ser interceptada para manejar llamadas a die. Esto no es adecuado para el manejo de excepciones, ya que es global. Sin embargo, puede usarse para convertir excepciones basadas en cadenas de paquetes de terceros en objetos.
local $SIG { __DIE__ } = sub { my $err = shift ; if ( $err -> isa ( 'MyException' )) { die $err ; # relanzar } else { # De lo contrario, construir una MyException con $err como una cadena die MyException::Default -> new ( $err ); } };Las formas mostradas arriba a veces pueden fallar si la variable global $@cambia entre el momento en que se lanza la excepción y el momento en que se verifica en la instrucción. Esto puede ocurrir en entornos multihilo, o incluso en entornos de un solo hilo cuando otro código (normalmente llamado en la destrucción de algún objeto) restablece la variable global antes del código de verificación. El siguiente ejemplo muestra una forma de evitar este problema (verif($@)o; cf.). Pero a costa de no poder utilizar los valores de retorno:
eval { # Código que podría lanzar una excepción (usando 'die') pero NO usa la instrucción return; 1 ; } o do { # Manejar la excepción aquí. La cadena de excepción está en $@ };Varios módulos de la Red Integral de Archivos Perl ( CPAN ) amplían el mecanismo básico:
ErrorProporciona un conjunto de clases de excepciones y permite el uso de la sintaxis try/throw/catch/finally.TryCatchy todos permiten el uso de la sintaxis try/catch/finally en lugar de código repetitivo para manejar las excepciones correctamente .Try::TinyNice::TryException::Classes una clase base y creador de clases para clases de excepción derivadas. Proporciona un rastreo de pila estructurado completo en y .$@->trace$@->trace->as_stringFatalsobrecarga funciones definidas previamente que devuelven verdadero/falso, por ejemplo,open,close,read,write, etc. Esto permite que las funciones integradas y otras se utilicen como si lanzaran excepciones.
PHP
// El manejo de excepciones solo está disponible en versiones de PHP 5 y superiores. try { // Código que podría lanzar una excepción throw new Exception ( 'URL no válida.' ); } catch ( FirstExceptionClass $exception ) { // Código que maneja esta excepción } catch ( SecondExceptionClass $exception ) { // Código que maneja una excepción diferente } finally { // Realizar la limpieza, independientemente de si ocurrió una excepción o no. }PowerBuilder
El manejo de excepciones está disponible en las versiones 8.0 y posteriores de PowerBuilder .
INTENTAR // Ruta de ejecución normal CAPTURAR (ExampleException ee) // Gestionar ExampleException FINALMENTE // Esta sección opcional se ejecuta al finalizar cualquiera de los bloques try o catch anteriores. FIN DEL INTENTO
PowerShell
Versión 1.0
trap [Exception] { # Instrucciones que se ejecutan en caso de una excepción } # Instrucciones en las que se pueden lanzar excepcionesVersión 2.0
Try { Import-Module ActiveDirectory } Catch [Exception1] { # Instrucciones que se ejecutan en caso de excepción, que coinciden con la excepción } Catch [Exception2],[Exception3etc] { # Instrucciones que se ejecutan en caso de excepción, que coinciden con cualquiera de las excepciones } Catch { # Instrucciones que se ejecutan en caso de excepción, que no se manejan de forma más específica }Pitón
f = None try : f = open ( "aFileName" , "w" ) f.write(could_make_error ( ) ) except IOError : print ( " No se puede abrir el archivo" ) except : # capturar todas las excepciones print ( "Error inesperado" ) else : # se ejecuta si no se generan excepciones print ( "Escritura del archivo completada con éxito" ) finally : # acciones de limpieza, siempre ejecutadas if f : f.close ( )R
tryCatch ({ stop ( "Aquí se señala un error" ) # la clase S3 predeterminada es simpleError, una subclase de error cat ( "Esta y las siguientes líneas no se ejecutan porque el error se captura antes\n" ) stop ( structure ( simpleError ( "mySpecialError message" ), class = c ( "specialError" , "error" , "condition" )) ) } , specialError = function ( e ) { cat ( "captura errores de la clase specialError\n" ) } , error = function ( e ){ cat ( "captura el error predeterminado\n" ) } , finally = { cat ( "realiza alguna limpieza (por ejemplo, setwd)\n" ) } )Rebol
REBOL [ Título: "Ejemplos de manejo de excepciones y errores" ]; INTENTAR un bloque; ¡capturando un error! ¡y convirtiéndolo a objeto! si error? excepción: intentar [ 1 / 0 ][ excepción de desarme de sonda ]; ATTEMPT da como resultado el valor del bloque o el valor ninguno en caso de error print attempt [ divide 1 0 ]; ¡Las excepciones generadas por el usuario pueden ser de cualquier tipo de dato! Ejemplo: func [ "Una función para lanzar una excepción" ][ throw "¡Soy una cadena! excepción" ] catch [ ejemplo ]; Las excepciones generadas por el usuario también pueden tener nombre, ; y las funciones pueden incluir atributos adicionales en tiempo de ejecución : sofisticada: func [ "Una función para lanzar una excepción de error con nombre" [ catch ] ][ throw /name make error! "Soy una excepción de error!" 'moniker ] catch /name [ sofisticada ] 'monikerRexx
señal al detenerse ; hacer a = 1 decir a hacer 100000 /* un retardo */ fin fin detener : decir "El programa fue detenido por el usuario" salirRubí
begin # Haz algo ingenioso raise SomeError , "¡Este es el mensaje de error!" # ¡Uy! rescue SomeError # Esto se ejecuta cuando se produce una excepción SomeError # rescue AnotherError => error # Aquí, el objeto de excepción se referencia desde la # variable `error' rescue # Esto captura todas las excepciones derivadas de StandardError retry # Esto ejecuta la sección begin de nuevo else # Esto se ejecuta solo si no se produjo ninguna excepción ensure # Esto siempre se ejecuta, con o sin excepción endJerga
intentar { % código que podría generar una excepción } capturar SomeError: { % código que maneja esta excepción } capturar SomeOtherError: { % código que maneja esta excepción } finalmente % bloque opcional { % Este código siempre se ejecutará }Se pueden crear nuevas excepciones utilizando la new_exceptionfunción, por ejemplo:
nueva_excepción ("MyIOError", IOError, "Mi error de E/S");creará una excepción llamada MyIOErrorcomo una subclase de IOError. Las excepciones pueden generarse utilizando la instrucción throw, que puede lanzar objetos S-Lang arbitrarios.
Charla informal
[ "código que podría lanzar una excepción" ] en: ExceptionClass hacer: [ : ex | "código que maneja la excepción" ] .El mecanismo general lo proporciona el mensaje . [ 8 ] Las excepciones son simplemente objetos normales que heredan de , se lanza una creando una instancia y enviándole un mensaje, por ejemplo, . El mecanismo de manejo ( ) es de nuevo simplemente un mensaje normal implementado por . La excepción lanzada se pasa como parámetro al cierre del bloque de manejo y se puede consultar, así como potencialmente enviarle , para permitir que el flujo de ejecución continúe.on:do:Error#signalMyExceptionnewsignal#on:do:BlockClosure#resume
Rápido
El manejo de excepciones es compatible desde Swift 2.
enum MyException : ErrorType { case Foo ( String , Int ) } func someFunc () throws { throw MyException . Foo ( "not enough food" , 2 ) } do { try someFunc () print ( "Not reached" ) } catch MyException . Foo ( let s , let i ) { print ( "MyException: \( s ) , \( i ) " ) } catch { print ( "Unexpected exception : \( error ) " ) }Tcl
if { [ catch { foo } err ] } { puts "Error: $err" }Desde Tcl 8.6, también existe un comando try:
try { someCommandWithExceptions } on ok { res opt } { # manejar el caso normal. } trap ListPattern1 { err opt } { # manejar excepciones con un código de error que coincida con ListPattern1 } trap ListPattern2 { err opt } { # ... } on error { err opt } { # manejar todo lo demás. } finally { # ejecutar cualquier comando que deba ejecutarse después del bloque try. }VBScript
Con New Try : On Error Resume Next 'hacer algo (solo se recomienda una instrucción) . Catch : On Error GoTo 0 : Select Case . Number Case 0 'esta línea es necesaria cuando se utiliza la cláusula 'Case Else' debido a la falta de la palabra clave "Is" en la instrucción Case de VBScript 'sin excepción Case SOME_ERRORNUMBER 'manejo de excepciones Case Else 'excepción desconocida End Select : End With' *** Clase de prueba *** Clase de prueba Privado mstrDescription Privado mlngHelpContext Privado mstrHelpFile Privado mlngNumber Privado mstrSourceSubpublicación Catch ( ) mstrDescription = Err.Description mlngHelpContext = Err.HelpContext mstrHelpFile = Err.HelpFile mlngNumber = Err.Number mstrSource = Err.Source End SubPropiedad pública Obtener origen () Origen = mstrSource Fin de la propiedad Propiedad pública Obtener número () Número = mlngNumber Fin de la propiedadPropiedad pública Obtener archivo de ayuda () Archivo de ayuda = mstrHelpFile Fin de la propiedad Propiedad pública Obtener contexto de ayuda () Contexto de ayuda = mlngHelpContext Fin de la propiedad Propiedad pública Obtener descripción () Descripción = mstrDescription Fin de la propiedad Fin de la claseVisual Basic 6
La sintaxis para el manejo de excepciones es muy similar a la de Basic. El manejo de errores es local en cada procedimiento.
On Error GoTo HandlerLabel 'Cuando se ha producido un error, salta a HandlerLabel, que se define en cualquier parte dentro de Function o Sub 'o On Error GoTo 0 'desactiva el manejo de errores. El error provoca un error fatal en tiempo de ejecución y detiene la aplicación 'o On Error Resume Next 'El objeto Err se establece, pero la ejecución continúa en el siguiente comando. Aún puede usar el objeto Err para verificar el estado del error. '... Err . Raise 6 ' Genera un error de "desbordamiento" usando el objeto incorporado Err. Si no hay un manejador de errores, el procedimiento que llama puede capturar la excepción con la misma sintaxis '...FinallyLabel : 'etiqueta común dentro del procedimiento (emulación no oficial de la sección Finally de otros lenguajes) ' código de limpieza, siempre ejecutado Exit Sub ' sale del procedimiento'Como estamos después de la instrucción Exit Sub, el siguiente código está oculto para la ejecución sin errores HandlerLabel : ' define una etiqueta común, aquí utilizada para el manejo de excepciones. If Err.Number = 6 Then 'La instrucción Select Case suele ser una mejor solución Resume FinallyLabel 'continúa la ejecución en una etiqueta específica. Normalmente algo con el significado de "Finalmente" en otros idiomas 'o Resume Next 'continúa la ejecución en la instrucción siguiente a "Err.Raise 6" 'o Resume 'continúa la ejecución en la instrucción (repetir) "Err.Raise 6" End IfMsgBox Err.Number & " " & Err.Source & " " & Erl & " " & Err.Description & " " & Err.LastDllError 'muestra un cuadro de mensaje con propiedades de error importantes ' Erl es la variable global de número de línea integrada de VB6 (si se usa ). Normalmente se usa algún tipo de complemento de IDE, que etiqueta cada línea de código con un número antes de la compilación Resume FinallyLabelEjemplo de implementación específica (no oficial) del manejo de excepciones, que utiliza un objeto de la clase "Try".
Con New Try : On Error Resume Next 'Crea un nuevo objeto de la clase "Try" y úsalo. Luego, establece este objeto como predeterminado. Puede ser "Dim T As New Try: ... ... T.Catch 'haz algo (solo se recomienda una instrucción) . Catch : On Error GoTo 0 : Select Case . Number 'Llama al procedimiento Try.Catch(). Luego desactiva el manejo de errores. Luego usa una instrucción "similar a switch" en el resultado de la propiedad Try.Number (valor de la propiedad Err.Number del objeto Err integrado) Case SOME_ERRORNUMBER 'manejo de excepciones Case Is <> 0 'Cuando Err.Number es cero, no ha ocurrido ningún error 'excepción desconocida End Select : End With' *** Clase de prueba *** Private mstrDescription As String Private mlngHelpContext As Long Private mstrHelpFile As String Private mlngLastDllError As Long Private mlngNumber As Long Private mstrSource As StringSubpublicación Catch ( ) mstrDescription = Err.Description mlngHelpContext = Err.HelpContext mstrHelpFile = Err.HelpFile mlngLastDllError = Err.LastDllError mlngNumber = Err.Number mstrSource = Err.Source End SubPropiedad pública Obtener origen () como cadena Origen = mstrSource Fin de la propiedadPropiedad pública Obtener número () Como Long Number = mlngNumber Fin de la propiedadPropiedad pública Obtener LastDllError () Como Long LastDllError = mlngLastDllError Fin de la propiedadPropiedad pública Obtener archivo de ayuda () como cadena Archivo de ayuda = mstrHelpFile Fin de la propiedadPropiedad pública Obtener HelpContext () Como HelpContext = mlngHelpContext Fin de la propiedadPropiedad pública Obtener descripción () como cadena Descripción = mstrDescription Fin de la propiedadVisual Basic .NET
Un Trybloque debe tener al menos una cláusula Catcho Finallycláusula y como máximo una Finallycláusula.
Try ' código que se ejecutará aquí Catch ex As Exception When condition ' Maneja la excepción cuando una condición específica es verdadera. El objeto de excepción se almacena en "ex". Catch ex As ExceptionType ' Maneja la excepción de un tipo especificado (es decir, DivideByZeroException, OverflowException, etc.) Catch ex As Exception ' Maneja la excepción (captura todas las excepciones de un tipo no especificado previamente) Catch ' Maneja cualquier cosa que pueda lanzarse, incluidas las excepciones que no son de CLR. Finally ' Siempre se ejecuta al salir del bloque try (incluidas las cláusulas catch), independientemente de si se lanzaron excepciones o si se manejaron. ' A menudo se usa para limpiar y cerrar recursos como los manejadores de archivos. ' Puede que no se ejecute cuando se llama a Environment.FailFast() y en otras condiciones excepcionales de todo el sistema (por ejemplo, pérdida de energía), o cuando el proceso falla debido a una excepción en otro hilo. End TryPrólogo visual
try % Bloque para proteger catch TraceId do % Código a ejecutar en caso de excepción; TraceId da acceso a la información de la excepción finally % El código se ejecutará independientemente de cómo se comporten las demás partes end tryX++
public static void Main ( Args _args ) { try { // Código que podría lanzar una excepción. } catch ( Exception :: Error ) // O cualquier otro tipo de excepción. { // Procesar el error. } catch { // Procesar cualquier otro tipo de excepción no manejada previamente. }// Este código se ejecutará mientras se capture alguna excepción. }Referencias
- ↑ Preguntas frecuentes de Bjarne Stroustrup
- ↑ "Manejo de excepciones" . Archivado del original el 2 de enero de 2014. Consultado el 1 de enero de 2014 .
- ↑ "Etiquetas de manejo de excepciones" . Archivado del original el 2 de enero de 2014. Consultado el 1 de enero de 2014 .
- ↑
- Ticket de seguimiento de problemas de la comunidad de JBoss para agregar
retry
- Ticket de seguimiento de problemas de la comunidad de JBoss para agregar
- ↑ Borland, Delphi Versión 7.0, Ayuda en línea
- ↑ Bloch, Joshua (2018). Java eficaz, tercera edición . Addison-Wesley. Artículo 9, pág. 54. ISBN 978-0-13-468599-1
- ↑ "La instrucción try-with-resources (Tutoriales de Java™ > Clases esenciales de Java > Excepciones)" .
- ↑ "Pharo by Example" . Archivado del original el 21 de octubre de 2009. Consultado el 20 de marzo de 2010 .
- 1 2 "Try-Catch para VB" . Archivado del original el 16 de abril de 2016. Recuperado el 17 de marzo de 2012 .
- ↑ "Referencia/Términos del idioma - wiki.visual-prolog.com" . wiki.visual-prolog.com . Consultado el 5 de enero de 2026 .
- sintaxis del lenguaje de programación
- Flujo de control
- Comparación de lenguajes de programación