English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En cualquier lenguaje de programación, se necesita manejo de excepciones para manejar errores de tiempo de ejecución, de modo que se pueda mantener el flujo normal de la aplicación. Las excepciones suelen interrumpir el flujo normal de la aplicación, por lo que necesitamos usar manejo de excepciones en la aplicación.
Por lo general, cuando ocurre una excepción o error en Erlang, se muestra el siguiente mensaje.
{"init terminando en do_boot", {undef,[{helloworld,start,[],[]}, {init,start_it,1,[]},{init,start_em,1,[]}]}}
La copia de seguridad de fallos se escribirá-
erl_crash.dump init terminando en do_boot()
En Erlang, hay3de tipo excepcional-
Error−la llamada detendrá la ejecución del proceso actual y incluirá el rastro de pila cuando se capture el último función y sus parámetros. Estas son las excepciones que desencadenan los errores de tiempo de ejecución mencionados anteriormente.erlang:error(Reason)
Exists −hay dos tipos de Exists: salida interna y salida externa. La salida interna se realiza mediante la llamada a la función exit/1para activar y detener la ejecución actual del proceso. La salida externa en exit/2se llama y está relacionado con varios procesos en el aspecto de concurrencia de Erlang.
Lanzar −throw es una clase de excepciones utilizada para situaciones que los programadores pueden manejar. En comparación con el salto y los errores, no traen ningún proceso de "¡colapso!" en su intención, sino que controlan el flujo. Cuando utiliza la excepción en situaciones donde espera que el programador maneje la excepción, es mejor registrar su uso en el módulo donde se utilizan.
try... catch es un método de cálculo de expresiones que le permite manejar tanto los casos de éxito como los errores encontrados.
try-La gramática general de la expresión catch se muestra a continuación.
intento de Expresión de Patrón exitoso1 [Guards] -> Expresión1; Patrón exitoso2 [Guards] -> Expresión2 catch TypeOfError:PatrónDeExcepción1 -> Expresión3; TypeOfError:PatrónDeExcepción2 -> Expresión4 end
La expresión entre try y of se llama protegida. Esto significa que cualquier tipo de excepción que ocurra en esta llamada será capturada. Los patrones y expresiones entre try... y catch son completamente iguales en comportamiento que case....
Finalmente, la sección catch - aquí, puede reemplazar TypeOfError con error, throw o exit para cada tipo que ve en este capítulo. Si no se proporciona un tipo, se asume que se lanza.
Error | Tipo de error |
---|---|
badarg | El tipo de datos del parámetro es incorrecto o el formato no es correcto. |
badarith | Parámetro erróneo en la expresión aritmética. |
{badmatch,V} | La evaluación de la expresión de coincidencia falla. El valor V no coincide. |
function_clause | No se encuentra la rama de la función coincidente al evaluar la llamada a la función. |
{case_clause,V} | No se encuentra la rama coincidente al calcular la expresión case. El valor V no coincide. |
if_clause | No se encuentra la rama verdadera al evaluar la expresión if. |
{try_clause,V} | No se encuentra la rama coincidente al calcular el segmento de la expresión try. El valor V no coincide. |
undef | No se encuentra la función al evaluar la llamada a la función. |
{badfun,F} | El divertido F tiene algún problema |
{badarit,F} | Un divertido se aplica al número de parámetros de error. F describe el entretenimiento y la controversia. |
timeout_value | El valor de timeout en la expresión receive..after se calculará como cualquier valor que no sea un entero o infinito. |
noproc | Intentar enlazar a un proceso inexistente. |
A continuación, se muestra un ejemplo de cómo usar estas excepciones y cómo manejarlas.
La primera función genera todos los tipos posibles de excepciones.
Luego escribimos una función encapsuladora que llama a generate_exception en una expresión try…catch.
-module(helloworld). -compile(export_all). generate_exception(1) -> a; generate_exception(2) -> throw(a); generate_exception(3) -> exit(a); generate_exception(4) -> {'EXIT', a}; generate_exception(5) -> erlang:error(a). demo1()) -> [catcher(I) || I <- [1,2,3,4,5]. catcher(N) -> try generate_exception(N) of Val -> {N, normal, Val} catch lanzar:X -> {N, capturado, lanzado, X}; salida:X -> {N, capturado, salido, X}; error:X -> {N, capturado, error, X} end. demo2()) -> [{I, (catch generar_excepcion(I))} || I <- [1,2,3,4,5]. demo3()) -> try generar_excepcion(5) catch error:X -> {X, erlang:get_stacktrace()} end. buscar(N) -> case(N) of 1 -> {'EXIT', a}; 2 -> salida(a) end.
Si ejecutamos el programa HelloWorld::demo()., obtendremos la siguiente salida
[{1,normal,a}, {2,capturado, lanzado, a}, {3,capturado, salido, a}, {4,normal,{'EXIT',a}}, {5,capturado, error, a}]