2017-01-20 1 views
1

R은 특정 예외에만 예외 처리를 목표로 삼기위한 지원을 제공합니까?특정 예외에 대한 예외 처리를 대상으로 지정하는 방법은 무엇입니까?


예를 들어 파이썬에서는 예외 처리를 특정 예외 유형으로 좁힐 수 있습니다. 예 :이 예에서

try: 
    return frobozz[i] 
except IndexError: 
    return DEFAULT 

는, 예외 처리는 i 정수를 경우에만에서 시작된다 등이 i >= len(frobozz) 또는 i < -len(frobozz)하지만, 예를 들어, i 문자열 "0" 인 경우의 결과 예외를 catch하지 않습니다 (IndexError 대신 TypeError이됩니다).

+0

정말로 무엇을하려고합니까? –

+0

일반적으로 예외를 피하기 위해 입력 검사를 구현합니다. – Roland

+0

R의 비슷한 기능을 알지 못하지만 오류 처리 기능을 완전히 탐색하지는 못했습니다. 시작하기에 유용한 곳은'? tryCatch'에 들어있는 링크와 기본 도움말 파일을 읽는 것입니다. – lmo

답변

1

Wellllll ... 예, 아니요, 거의 없습니다.

모든 Python 예외는 Error에서 파생 된 특정 오류 클래스로 래핑되고 Python 모듈은 "올바른"종류의 오류를 발생시킵니다. 예를 들어, 범위를 벗어난 인덱스의 인덱스는 IndexError를 던져야합니다. 기본 언어는 이러한 오류를 알고 있으므로 except ... 절에서 적절한 오류 유형을 찾을 수 있습니다.

R은 그렇게하지 않습니다. 오류는 유형이 지정되지 않습니다. 범위를 벗어나는 색인과 다른 오류 사이에는 근본적인 차이가 없습니다.

그건 그렇고, 매우 제한된 특정 상황에서 속일 수 있습니다.

> y <- tryCatch(x[[2]], error = function(e) e) 
> y 
<simpleError in x[[2]]: subscript out of bounds> 
> y$message 
[1] "subscript out of bounds" 

여기서 핵심은 tryCatch 기능과 error 조항의 사용이다. tryCatch의 error 절은 'simpleError'유형의 객체이고 "message"라는 항목이 포함 된 e에 대해 임의의 연산을 수행 할 수있는 하나의 변수의 함수입니다. 당신은 메시지를 분석하고 당신이 실제로 당신이보고 싶어 오류 문자열을 검색 할 수있는 경우 별도로

> y <- tryCatch(x[[2]], 
    error = function(e) { 
    if ('subscript out of bounds' == e$message) return(NA) else stop(e)) 
    }) 
> y 
[1] NA 

이 단지 작품을 흥미로운 사건을 처리하고 그 보장 할 수 없습니다 수 있습니다. (다시 말하지만, 파이썬에서도 보장되지 않습니다. 따라서 모든 것이 서로 크게 다르지 않습니다.)

마지막 질문 : 천국의 이름으로 이것을 왜하고 있습니까? 당신은 무엇입니까 정말하려고합니까?

+0

그러나 명확성을 위해서 x [[a ']]'를 잡을 수는 없으며 여전히 NA를 반환합니다. R은 조회에서 값 유형으로 인한 오류를 구분하지 않습니다. 조회 연산자를 다시 정의하지 않아도됩니다. - 나는 그렇게 할 수있는 방법을 생각할 수 없다. – JWLM

관련 문제