English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
모든 프로그래밍 언어에서는 실행 시간 오류를 처리하기 위해 예외 처리가 필요합니다. 이는 애플리케이션의 정상적인 흐름을 유지하기 때문입니다. 예외는 일반적으로 애플리케이션의 정상적인 흐름을 방해합니다. 이는 애플리케이션에서 예외 처리를 사용하는 이유입니다.
일반적으로 Erlang에서 예외나 오류가 발생할 때, 다음과 같은 메시지가 표시됩니다.
{"init 템포레이팅 do_boot", {undef,[{helloworld,start,[],[]}, {init,start_it,1,[]},{init,start_em,1,[]}]}}
이 충돌 전용 레이어는 기록될 것입니다-
erl_crash.dump init 템포레이팅 do_boot()에 중지됨
Erlang에서는 다음과 같은 예외 유형이 있습니다.3예외 유형-
Error−호출은 현재 프로세스의 실행을 종료하고, 마지막 함수 및 매개변수를 포함한 스택 트레이스를 포함합니다. 이들은 위의 실행 시간 오류를 일으키는 예외입니다.erlang:error(Reason)
Exists −有两种Exists : 내부 탈출과 외부 탈출. 내부 탈출은 함수 exit/1를 통해 일어나 현재 프로세스가 실행을 중단합니다. 외부 출구는 exit/2이 함수가 호출되고, Erlang의 병렬 면에서 여러 프로세스와 관련이 있습니다.
Throw −throw는 프로그래머가 처리할 수 있는 예외로, 종료와 오류와 달리 '죽음 과정!'과 같은 의도를 가지지 않습니다. 그들은 제어된 흐름을 가지고 있습니다. 프로그래머가 예외를 던지기를 기대할 때, 일반적으로 그들의 사용을 기록하는 것이 좋습니다.
try...catch는 계산 표현 방법 중 하나로, 성공적인 경우와 발생하는 오류를 동시에 처리할 수 있도록 합니다.
try-catch 표현의 일반 문법은 다음과 같습니다.
표현 시도 성공 패턴1 [경비대] -> Expression1; 성공 패턴2 [경비대] -> Expression2 catch TypeOfError:ExceptionPattern1 -> Expression3; TypeOfError:ExceptionPattern2 -> Expression4 end
try와 of 사이의 표현식은 보호된 표현식으로 불립니다. 이는 호출에서 발생하는 모든 유형의 예외가 캡처됨을 의미합니다. try...와 catch 사이의 패턴과 표현식은 case...의 동작 방식과 완전히 동일합니다.
마지막으로, catch 부분 - 여기서는 이 장에서 본 각 유형에 대해 error, throw 또는 exit를 TypeOfError로 대체할 수 있습니다. 타입이 제공되지 않으면 기본적으로 throw이 발생합니다.
Error | 에러 타입 |
---|---|
badarg | 매개변수의 데이터 타입이 잘못되었거나 형식이 올바르지 않습니다. |
badarith | 산술 표현식의 오류 매개변수. |
{badmatch,V} | 표현식의 평가가 실패합니다. 값 V가 일치하지 않습니다. |
function_clause | 함수 호출을 평가할 때 일치하는 함수 문구를 찾을 수 없습니다. |
{case_clause,V} | case 표현식을 계산할 때 일치하는 분기가 없습니다. 값 V가 일치하지 않습니다. |
if_clause | if 표현식을 평가할 때 진정한 분기를 찾을 수 없습니다. |
{try_clause,V} | try 표현식의 섹션을 계산할 때 일치하는 분기가 없습니다. 값 V가 일치하지 않습니다. |
undef | 함수 호출을 평가할 때 해당 함수를 찾을 수 없습니다. |
{badfun,F} | 재미로운 F가 문제를 일으키고 있습니다 |
{badarit,F} | 오류 수에 적용된 흥미로운 함수가 있습니다. F는 그 중의 재미와 논쟁을 설명합니다. |
timeout_value | receive..after 표현식의 타임아웃 값은 정수나 무한대를 제외한 다른 값으로 계산됩니다. |
noproc | 없는 프로세스에 연결하는 시도 |
이제 이러한 예외를 사용하고 처리하는 방법에 대한 예제를 보여줍니다.
첫 번째 함수는 모든 가능한 예외 유형을 생성합니다.
그런 다음 우리는 generate_exception을 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 throw:X -> {N, caught, thrown, X}; exit:X -> {N, caught, exited, X}; error:X -> {N, caught, error, X} end. demo2) -> [{I, (catch generate_exception(I))} || I <- [1,2,3,4,5]]. demo3) -> try generate_exception(5) catch error:X -> {X, erlang:get_stacktrace()} end. lookup(N) -> case(N) of 1 -> {'EXIT', a}; 2 -> exit(a) end.
만약 우리가 프로그램의 HelloWorld:demo().를 실행하면, 다음과 같은 출력을 얻을 것입니다.
[{1,normal,a}, {2,caught,thrown,a}, {3,caught,exited,a}, {4,normal,{'EXIT',a}}, {5,caught,error,a}]