2010-02-16 5 views
3

나는 Erlang에서 코딩하고 있는데, 특히 Erlang이 항상 반환하는 추악한 오류를보고 난 후에 오류 처리에 접근하는 방법에 대해 확신 할 수 없다.Erlang에서 try catch를 사용해야합니까, 아니면 오류 토큰을 다시 전달해야합니까?

Erlang에서 try catch를 사용해야합니까, 아니면 오류 토큰을 다시 전달해야합니까?

+0

이렇게 보이는 것이 "yer Erlang cliché! Throw in yer Erlang cliché!"입니다. 위키 :) – Zed

답변

6

:

  1. 가 던졌습니다 (throw(Term))
  2. 오류 (erlang:error(Reason))
  3. 종료 (exit(Reason))

를 throw 지역 이외 지역에서의 반품 및 귀하가 한시 할 수있는 몇 가지 종류의 예외에 사용됩니다. dle (아마 자주 발생하기 때문에). 그 중 하나가 제기되면 모듈 밖으로 나가기 전에 시도하고 중지해야합니다. stdlib에서 사용되는 일반적인 방법은 튜플을 사용자에게 반환하기 전에 try...catch에있는 최상위 함수에 의해 캐치 될 종류 {error, Reason}의 튜플을 던지기위한 것입니다. 그런 다음 사용자는 해당 반환 값을 기반으로 수행 할 작업을 결정할 수 있습니다.

오류은 복구 할 수없는 예외를 가리 킵니다. 그들은 대개 사용자가 코드를 변경하도록 요구합니다. 여기에는 if 또는 case ... of 분기와 같은 런타임 오류, 일치하지 않거나 존재하지 않는 함수 등이 포함됩니다.이 오류의 목적은 충돌하는 것이므로 프로세스에 국한되거나 처리되지 않아야합니다 대부분의 경우 (감독자 또는 모니터링 프로세스에서 오류 메시지를 수집 한 다음 인터페이스 수준에서 사용자를 위해 오류 메시지를 처리하거나 로그 처리하도록하십시오).

특히 종료 프로세스를 원할 때 종료을 사용해야합니다. 출구 또는 오류를 사용할 때가 때로는 약간의 차이가있을 수 있지만 팁은 의도를 구분하는 것입니다.

오류와 종료를 처리하고 처리해야하는 경우가 거의 없습니다 (실제로 문제를 해결하는 방법을 알고 있어야합니다!). 추락 시키자.

(자세한 내용 : http://learnyousomeerlang.com/errors-and-exceptions)


멀티 프로세스 환경에서 오류를 처리 할 때 다음 단계입니다. 이 시점에서 작업을 수행하는 표준 방법은 프로세스를 연결하여 (그리고/또는 감독자를 사용하여) 죽은 프로세스와 그 이유를 확인하는 것입니다. 다시 시작하고, 메시지를 기록하고, 유지 관리를 수행하고, 시스템이 지속적으로 롤업하는 동안 업그레이드합니다 .

여러 프로세스에 대해 새로운 예외 기능을 얻게됩니다 : exit(Pid, Reason). 이렇게하면 다른 프로세스에서 '종료'를 호출 할 수 있습니다. 이 경우 오류 처리는 모니터 프로세스에 process_flag(trap_exit, true)을 설정하여 수행해야하며, 그 후에 표준 receive 표현식을 통해 종료 신호를 얻을 수 있습니다.

특별한 종류의 종료 즉, exit(Pid, kill)은 프로세스를 포착 할 가능성이없는 프로세스를 종료합니다. Pid에 연결된 다른 프로세스는 {'EXIT', killed} 형태의 신호를 수신해야합니다.

감독 트리를 사용하면 프로그램을 계속 실행하는 방법을 알 수 있습니다. 일찍 부숴 버리는 것도 당신이 아무 것도 손상시키지 않도록하기 위해 필수적입니다. 이전의 문제 코드가 실행을 멈 추면 모든 것을 쉽게 청소할 수 있습니다.

3

예외적으로 현명하게 처리 할 수 ​​있다면 잡아서 처리하십시오. 그렇지 않으면 거품이 나오게하십시오.

특정 예외가 발생해도 아무 것도 할 수 없다는 것을 알고 있으면 "빠름"합니다.

+1

나는이 문제를 현지에서 예외적으로 처리하는 ** 현명하게 처리한다고 말하면서 자격을 얻습니다.어디에서나 오류 토큰에 대한 테스트를 추가하여 항상 "처리"할 수는 있지만 이는 매우 드물다. – rvirding

3

이것은 주로이 기능의 사용자가 원하는 것의 문제라고 생각합니다. 매우 낮은 수준의 파일 API의 예는 파일을 열고 파일 핸들을 가져오고, 파일 핸들을 전달하는 파일을 읽고, 파일 핸들을 전달하는 파일을 닫는 표준입니다.

더 높은 수준의 API는 file:consult/1이며 파일 이름을 전달하고 콘텐츠를 얼랭으로 다시 파싱 할 것으로 기대합니다. 중간 지점은 함수이며, 열린 파일 핸들을 인수로 사용하여 호출되는 함수를 전달하는 곳에서 사용됩니다.

파일을 모두 열고 액세스하는 경우에도 오류 토큰 대신 예외를 사용하여 상황이 어떻게되는지 설명하는 것이 더 바람직합니다.

프로그래머가 성공 사례에 대해 읽을 수있는 코드를 쓸 수있게하려고합니다. 파일이 존재하지 않을 것으로 예상된다면 반환 값에 대한 간단한 경우는 예외 처리보다 더 쉬운 경향이 있습니다. 성공한 사례가 파일이 있다고 가정하고 읽는 것뿐이라면 예외가 발생하지 않는 즉시 예외가 발생합니다.

Erlang이 추악한 오류 메시지를 가지고 있다고 생각하기 때문에 특정 접근법을 선택하는 것은 좋은 지침처럼 보이지 않습니다.

6

얼랑의 기본 원칙은 다음과 같습니다

가 충돌합니다!

소위 방어 프로그래밍을 피하는 데 매우 유용합니다.. 개념은 얼랑 프로그래밍 규칙 페이지에서 좀 더 자세히 설명되어 있습니다 :

http://www.erlang.se/doc/programming_rules.shtml#HDR11

또한, 얼랑 오류 중 일부는 약간의 비밀이 될 수없는 경우에도 처리하는 좋은 방법은 추적입니다 그들! Erlang에서의 추적은 매우 간단합니다.

http://aloiroberto.wordpress.com/2009/02/23/tracing-erlang-functions/

를하거나 공식 문서를 참조하십시오 :이 빠른 참조를 보라.

이것은 @jdupont와 완전히 동의합니다.연속 얼랑에서 예외 처리를 할 수있는 세 가지 기본 방법이 있습니다

관련 문제