2013-05-21 34 views
5

Tôi đang viết một trường hợp thử nghiệm cho một hàm R kiểm tra xem có lỗi nào bị ném và bị bắt chính xác tại một điểm nhất định trong hàm hay không. gặp khó khăn khi thử nghiệm để tiếp tục khi một lỗi được ném trong khi thực hiện trong withCallingHandlers (...). Tôi đang sử dụng cách tiếp cận này:Làm thế nào để tiếp tục hoạt động khi lỗi được đưa vào withCallingHandlers trong R

counter <- 0 
withCallingHandlers({ 
testingFunction(df0, df1) 
testingFunction(df2, df3) 
testingFunction(df4, df5) 

}, warning=function(war){ 
    print(paste(war$message)) 
}, error=function(err){ 
    print(paste(err$message)) 
    if(err$message == paste("The function should throw this error message", 
           "at the right time.")){ 
     counter <<- counter + 1 
    } 

}) 

stopifnot(counter == 2) 

Vấn đề tôi gặp phải là tập lệnh thoát sau khi lỗi đầu tiên được bắt thành công và tôi không chắc chắn cách xử lý lỗi sao cho sau nó bị bắt, withCallingHandlers chỉ đơn giản là tiếp tục vào phần tiếp theo của việc thực hiện nó. Tôi hiểu rằng nó có cái gì đó để làm với một đối tượng khởi động lại nhưng tôi không chắc chắn làm thế nào để sử dụng chúng một cách chính xác. Có ai biết làm thế nào tôi có thể thao tác các mã trên để thực hiện withCallingHandlers (...) tiếp tục ngay cả khi một lỗi được bắt?

Trả lời

4

Bạn chỉ có thể quấn mỗi cuộc gọi đến testingFunction với một cuộc gọi đến tryCatch:.

counter <- 0 
testForExpectedError <- function(expr) { 
    tryCatch(expr, error=function(err) { 
     print(paste(err$message)) 
     if(err$message == paste("The function should throw this error message", 
           "at the right time.")){ 
      counter <<- counter + 1 
     } 
    }) 
} 

testForExpectedError(testingFunction(df0, df1)) 
testForExpectedError(testingFunction(df2, df3)) 
testForExpectedError(testingFunction(df4, df5)) 

stopifnot(counter == 2) 
+0

Tuyệt vời, cảm ơn rất nhiều. – Decave

6

Đối với một chức năng kiểm tra

fun1 = function() stop("something specific went wrong") 

thành ngữ

obs = tryCatch(fun1(), error=conditionMessage) 
exp = "something specific went wrong" 
stopifnot(identical(exp, obs)) 

là có thể là một ngăn nắp phiên bản của Ryan, và giống như anh ta tránh được trường hợp không may khi có lỗi nhưng vì lý do sai. Các mô hình tương tự làm việc cho cảnh báo

fun2 = function(x) as.integer(x) 
obs = tryCatch(fun2(c("1", "two")), warning=conditionMessage) 
stopifnot(identical("NAs introduced by coercion", obs)) 

và để kiểm tra đánh giá 'sạch'

obs = tryCatch(fun2(c("1", "2")), warning=conditionMessage, 
      error=conditionMessage) 
stopifnot(identical(1:2, obs)) 

này là ok, với điều kiện Sys.getlocale() là "C" hay cách khác mã hóa mà không làm thay đổi bản dịch của thông điệp tình trạng.

Các vấn đề liên quan